monads
翻譯叫 「單子」
或者 「乙個自函子上的么半群」
好吧除了讓人費解沒有什麼用
同樣舉乙個書上的例子
data expr = val int |div expr expreval :: 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 bmx >>= 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) = don <-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中寫函式其實和數學上的表示...