6
假設我有以下代碼哈斯克爾:做記號,並返回單子
do {x <- (Just 3); y <- (Just 5); return (x:y:[])}
,輸出Just [3,5]
如何哈斯克爾知道產值應該在Maybe
單子?我的意思是return
可能輸出[[3, 5]]
。
假設我有以下代碼哈斯克爾:做記號,並返回單子
do {x <- (Just 3); y <- (Just 5); return (x:y:[])}
,輸出Just [3,5]
如何哈斯克爾知道產值應該在Maybe
單子?我的意思是return
可能輸出[[3, 5]]
。
do {x <- (Just 3); y <- (Just 5); return (x:y:[])}
desugars到
Just 3 >>= \x -> Just 5 >>= \y -> return $ x:y:[]
由於>>=
類型是Monad m => m a -> (a -> m b) -> m b
和每一個參數Just 3
(或者Just 5
)我們有m ~ Maybe
,表達的返回類型必須有一些Maybe
類型。
沒有讓這個回報[[3, 5]]
使用的東西從category theory稱爲natural transformations的可能性。由於存在自然轉化,從Maybe a
到[a]
,即
alpha :: Maybe a -> [a]
alpha Nothing = []
alpha (Just a) = [a]
我們有你需要的功能僅僅是應用於結果的自然轉化:
alpha (Just 3 >>= \x -> Just 5 >>= \y -> return $ x:y:[])
-- returns [[3, 5]]
由於這是一個自然的改造,你也可以申請alpha
第一和你的函數第二:
alpha (Just 3) >>= \x -> alpha (Just 5) >>= \y -> return $ x:y:[]
-- returns [[3, 5]]
由於@duplode指出Ø ut,您可以在包Data.Maybe
中找到alpha
作爲maybeToList
。
值得一提的是,這個'alpha'可以從'Data.Maybe'的'maybeToList'獲得。 – duplode