From dba4ea41ce332f6945e61f580aee675a50a9b237 Mon Sep 17 00:00:00 2001 From: Marvin Borner Date: Fri, 7 Jun 2024 13:31:29 +0200 Subject: Some more work on monads --- std/Monad.bruijn | 49 +++---------------------------------------------- 1 file changed, 3 insertions(+), 46 deletions(-) (limited to 'std/Monad.bruijn') diff --git a/std/Monad.bruijn b/std/Monad.bruijn index 0dae29e..0feec73 100644 --- a/std/Monad.bruijn +++ b/std/Monad.bruijn @@ -1,47 +1,4 @@ -# MIT License, Copyright (c) 2023 Marvin Borner -# monadic interface for anything based on lists (e.g. IO, strings) -# afaik originally proposed by John Tromp and inspired by Haskell +# MIT License, Copyright (c) 2024 Marvin Borner +# just a reference to the list monad (default interface) -:import std/List . -:import std/Combinator . - -read [0] ⧗ a → (M a) - -return [[1 : 0]] ⧗ a → (M a) - -pure return ⧗ a → (M a) - -# monadic bind operator -…>>=… [[[2 0 1]]] ⧗ (M a) → (a → (M b)) → (M a) - -:test ((read >>= return) "woa") ("woa") - -# monadic reverse bind operator -…=<<… \…>>=… ⧗ (a → (M b)) → (M a) → (M b) - -:test ((return =<< read) "woa") ("woa") - -# monadic compose operator -…>>… [[1 >>= [1]]] ⧗ (M a) → (M b) → (M b) - -:test ((read >> (return 'a')) "hah") ("aah") - -# monadifies a list -lift-m map ⧗ (a → b) → (M a) → (M b) - -# monadifies a list with two monadic arguments -lift-m2 [[[concat ([[4 1 0] <$> 1] <$> 1)]]] ⧗ (a → b → c) → (M a) → (M b) → (M c) - -# evaluates monadic actions -sequence foldr (lift-m2 cons) {}empty ⧗ (List (M a)) → (M (List a)) - ->‣ [sequence ∘∘ 0] - -# traverses list based on modifier -traverse sequence ∘∘ map ⧗ (a → (M b)) → (N a) → (M (N b)) - -# performs action n times -replicate-m >replicate ⧗ Number → (M a) → (M (List a)) - -# maps elements to a monadic action -map-m >map ⧗ (a → (M b)) → (List a) → (M (List b)) +:input std/Monad/List -- cgit v1.2.3