2017-02-14 28 views
6

假設我有以下代碼哈斯克爾:做記號,並返回單子

do {x <- (Just 3); y <- (Just 5); return (x:y:[])} 

,輸出Just [3,5]

如何哈斯克爾知道產值應該在Maybe單子?我的意思是return可能輸出[[3, 5]]

回答

18
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

+1

值得一提的是,這個'alpha'可以從'Data.Maybe'的'maybeToList'獲得。 – duplode