![](/img/trans.png)
[英]Haskell: Would “do” notation be useful for contexts other than monads?
[英]Haskell: do notation and return in Monads
假設我有以下代碼
do {x <- (Just 3); y <- (Just 5); return (x:y:[])}
哪個輸出Just [3,5]
haskell如何知道輸出值應該在Maybe
monad中? 我的意思是return
可以輸出[[3, 5]]
。
do {x <- (Just 3); y <- (Just 5); return (x:y:[])}
des to to to
Just 3 >>= \x -> Just 5 >>= \y -> return $ x:y:[]
由於>>=
的類型是Monad m => ma -> (a -> mb) -> mb
和每個參數Just 3
(或者Just 5
)我們有m ~ Maybe
,表達式的返回類型必須是一些Maybe
類型。
有可能使用類別理論中的 自然變換來回報[[3, 5]]
。 因為存在從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指出的那樣,你可以在包Data.Maybe
找到alpha
作為maybeToList
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.