加入Haskell的不同单子

时间:2018-09-24 22:37:24

标签: haskell monads

我知道我可以使用join删除列表的第一级

join [["dog"]]“输出["dog"]

但是以下原因为何不起作用

join $ (Just ["dog"]) 

got error:
Couldn't match type ‘[]’ with ‘Maybe’

我们知道Maybe[]都是Haskell的Monad,

join(Monad m)=> m(m a) -> m a

Maybe是Monad

[]是Monad

这有什么问题?

在我看来,仅加入同一类型的Monad, 如果我错了,请纠正我。

像上面给出的示例一样,是否有任何类似于Monad的联接函数?

我知道我可以按照以下步骤做

fromJust (Just ["dog"]) 

"output:  ["dog"]

但是我需要提前知道。

1 个答案:

答案 0 :(得分:6)

private String userName = ""; private String userid = ""; 中的m在出现的每个地方都是同一个Monad。如果您有join :: Monad m => m (m a) -> m a,则您有两个Just (Just "dog")单子,而您的Maybe将会完美运行。类似于您的列表示例。

将事物从Monad中拉出不能一概而论,这是Monad强大功能的一部分。考虑一下,如果您可以做到这一点,那么剥离IO Monad的类型安全性将是微不足道的!

要从join出发,您只需要一个Just ["dog"] -> ["dog"],就可以使用Maybe a -> a,但是Data.Maybe.fromJust更安全(如果您有maybe呢? )