Just (+) <*> Just 3 <*> Just 5
Just 8
pure (+) <*> Just 3 <*> Just 5
Just 8
pure (*3) <*> [0..10]
[0,3,6,9,12,15,18,21,24,27,30]
Just (*3) <*> [0..10]
Couldn't match type ‘[]’ with ‘Maybe’
Expected type: Maybe b
Actual type: [b]
In the second argument of ‘(<*>)’, namely ‘[0 .. 10]’
In the expression: Just (* 3) <*> [0 .. 10]
In an equation for ‘it’: it = Just (* 3) <*> [0 .. 10]
pure
是什么时候和 Just
可互换,它们何时不同?
最佳答案
pure
是重载操作。它是为所有实现 Applicative
的类型定义的。类(class)。执行此操作的类型之一是 Maybe
.所以pure
在这种情况下,与 Just
相同。 .但是还有其他类型也实现了 Applicative
如[]
(列表)。在这种情况下,pure
表示单例(即接受单个值并返回包含该值的单元素列表的函数)。所以
pure (*3) <*> [0..10]
真正意思:
[(*3)] <*> [0..10]
并不是
Just (*3) <*> [0..10]
在最后一个示例中,您试图将列表与可能混合在一起,这就是 GHC 拒绝它的原因。一般来说,haskell 会弄清楚
pure
的确切含义是什么。基于上下文,例如如果您尝试将它与 mays 一起使用,它会将其解释为 Just
,如果您将其与列表一起使用,则将其解释为单例。
关于haskell - 'Just' 和 'pure' 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39469980/