Haskell學習筆記 Monads

2022-09-07 05:45:09 字數 1371 閱讀 6740

monads

翻譯叫 「單子」

或者 「乙個自函子上的么半群」

好吧除了讓人費解沒有什麼用

同樣舉乙個書上的例子

data expr = val int |div expr expr

eval :: expr ->maybe int

eval (val n) =pure n

eval (div x y) = pure safediv <*> eval x <*> eval y

可以看出這個型別是錯的 它得到了乙個maybe (maybe int)

safediv :: int -> int -> maybe int

(>==) :: maybe a -> (a -> maybe b) ->maybe b

mx >>= f = case

mx of

nothing ->nothing

just x ->f x

eval (val n) =just n

eval (div x y) = eval x >> = \n ->eval y >> = \m ->safediv n m

等價的好看寫法(語法糖):

m1 >>= \x1 ->m2 >>= \x2 ->...

mn >>= \xn ->f x1 x2 .. xn

equals

dox1

<-m1

x2 <-m2

...xn

<-mn

f x1 x2 .. xn

栗子:

eval (div x y) = do

n <-eval x

m <-eval y

safediv n m

instance monad maybe where

(>>=) :: maybe a -> (a -> maybe b) ->maybe b

nothing >>= _ =nothing

(just x) >>= f =f x

instance monad

where

(>>=) :: [a] -> (a -> [b] ) ->[b]

xs >>= f = [y | x <- xs , y <-f x ]

來點應用(有些懵了

pairs :: [a] -> [b] ->[(a,b)]

pairs xs ys = do

x <-xs

y <-ys

return (x,y)

return (x,y) = pure (x,y)  =  [(x,y)] 

Haskell語言學習筆記(68)HDBC

cabal install hdbc sqlite3 installed hdbc sqlite3 2.3 3.1 prelude m database.hdbc database.hdbc sqlite3 prelude database.hdbc database.hdbc sqlite3 pr...

Haskell語言學習筆記(79)lambda演算

根據維基百科,lambda演算 英語 lambda calculus,calculus 是一套從數學邏輯中發展,以變數繫結和替換的規則,來研究函式如何抽象化定義 函式如何被應用以及遞迴的形式系統。lambda演算由 lambda 項的語言構成。基本的 lambda 項只包含以下三種 語法名稱 描述h...

Haskell筆記 (五) 高階函式

了解高階函式 高階函式是haskell的重要性質,同時也是所有函式式語言的共同性質,高階函式實際上就是函式的函式,就是把某個函式作為另乙個函式的引數的形式,就是高階函式。還是來看個例子吧,取乙個函式並呼叫它兩次的函式 用數學表示式表達出來就是 f f x 而在haskell中寫函式其實和數學上的表示...