[英]Define bind without join for the list monad in Haskell
我了解>>=
在join
的定義
xs >>= f = join (fmap f xs)
這也告訴我們fmap + join
產生>>=
我想知道List
Monad是否可以不使用join
進行定義,例如對Maybe
:
>>= m f = case m of
Nothing -> Nothing
Just x -> f x
當然。 GHC/Base.hs
的實際定義是根據等效列表理解的:
instance Monad [] where
xs >>= f = [y | x <- xs, y <- f x]
或者,您可以嘗試使用以下方法從該類型從頭開始進行計算:
(>>=) :: [a] -> (a -> [b]) -> [b]
我們需要處理兩種情況:
[] >>= f = ???
(x:xs) >>= f = ???
首先很容易。 我們沒有類型a
元素,因此不能應用f
。 我們唯一能做的就是返回一個空列表:
[] >>= f = []
對於第二個, x
是類型a
的值,因此我們可以應用f
給我們提供類型[b]
的fx
值。 這是我們列表的開始,我們可以將其與遞歸調用生成的列表的其余部分連接起來:
(x:xs) >>= f = f x ++ (xs >>= f)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.