簡體   English   中英

為Haskell中的列表monad定義沒有連接的綁定

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM