我知道我可以使用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"]
但是我需要提前知道。
答案 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
呢? )