【发布时间】:2017-02-02 14:20:51
【问题描述】:
我正在尝试实现一个通常将列表的第一个元素放入 monad 的函数,但如果 monad 是一个列表,它会返回整个列表:
putInMonad :: MonadPlus m => [a] -> m a
putInMonad (s:sx) = return s
putInMonad _ = mzero
putInMonad [1,2,3] :: Maybe Int
应该返回Just 1,并且
putInMonad [1,2,3] :: [] Int
应该返回[1,2,3]。
有什么想法吗?
【问题讨论】:
-
你可以使用
[[]] Int作为低级monad。 -
@WillemVanOnsem 不,因为表达式
return s不包含任何关于sx的信息;简单地提供一个具体的返回类型并没有帮助。 -
@chepner:是的,我知道对于特定的 monad,它的行为不会有所不同。我只是想用另一种方式解决问题:给它一个列表列表而不是项目列表。
标签: haskell monads alternative-functor monadplus