haskell - 'Just' 和 'pure' 之间的区别

标签 haskell functor applicative

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/

相关文章:

ocaml - 如何在仿函数 OCaml 中转换类型

c++ - 如何迭代派生函数对象列表并访问派生对象成员变量

haskell - Haskell 类型类中的乘积和求和类型并行

haskell - 默认库中有bindN吗?

haskell - 半组安装因 cabal 失败

haskell - 从上下文中猜测 Num 的正确实例

Haskell 函数不兼容的类型和定义

haskell - 纯 Haskell Lambda 微积分中列表的仿函数性

haskell - 为什么 `((,) r)` 不是 Applicative 的 Functor?

haskell - 在 Haskell 中表示棋盘