【发布时间】:2018-12-12 20:23:38
【问题描述】:
为了理解 Monad,我想出了以下定义:
class Applicative' f where
purea :: a -> f a
app :: f (a->b) -> f a -> f b
class Applicative' m => Monadd m where
(>>|) :: m a -> (a -> m b) -> m b
instance Applicative' [] where
purea x = [x]
app gs xs = [g x | g <- gs, x <- xs]
instance Monadd [] where
(>>|) xs f = [ y | x <-xs, y <- f x]
它按预期工作:
(>>|) [1,2,3,4] (\x->[(x+1)])
[2,3,4,5]
我不确定它是如何工作的。 例如:
[ y | y <- [[1],[2]]]
[[1],[2]]
将(\x->([x+1]) 应用到[1,2,3] 的每个列表元素如何导致[2,3,4] 而不是[[2],[3],[4]]
或者很简单,我的困惑似乎源于不理解这句话 [ y | x <-xs, y <- f x] 的实际工作原理
【问题讨论】:
-
你自己写的。
(>>|) xs f = [ y | x <-xs, y <- f x]。这是原始列表的不是“应用程序...对每个元素”,这是另外一回事。对每个元素的应用程序将是map f xs = [f x | x <- xs]。 -
是的,看来我还没有理解
[ y | x <-xs, y <- f x]的工作原理 -
在那个表达式中写下 x、xs、y 和 f x 的类型应该会有所帮助。