假设我有以下代码
do {x <- (Just 3); y <- (Just 5); return (x:y:[])}输出Just [3,5]
haskell是如何知道产值应该是Maybe单子的?我的意思是return可以输出[[3, 5]]。
发布于 2017-02-14 15:12:46
do {x <- (Just 3); y <- (Just 5); return (x:y:[])}脱糖
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]]的自然变换来返回范畴理论。因为存在从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所指出的,您可以在包alpha中找到Data.Maybe作为maybeToList。
https://stackoverflow.com/questions/42229584
复制相似问题