【问题标题】:Haskell - Applicative/Monad instancesHaskell - Applicative/Monad 实例
【发布时间】:2016-03-05 19:19:36
【问题描述】:

我已经看到pure 1的类型是(Num a, Applicative f) => f a,这很明显。 所以如果我想让它成为Maybe Int:

Prelude> pure 1 :: Maybe Int
Just 1

这个怎么样?

Prelude> pure 1
1
Prelude> return 1
1

发生了什么事?为什么不抱怨不知道选择哪个实例??

编辑

我认为这种行为实际上与 monads 或 applicatives 无关,但这是我来到它的上下文......

【问题讨论】:

标签: haskell monads applicative


【解决方案1】:

这是 ghci 的一个特性。它对IO 操作具有特殊处理,这些操作不仅仅是“计算”和打印(无论如何您都不能打印 IO 操作),而是执行并结果†支持>打印。所以,

Prelude> pure 1 :: IO Integer
1

根据 behzad.nouri 的评论,here's the relevant manual section


如果它是IO aShow a 而不是a~(),否则执行该操作。

【讨论】:

  • 所以,实际上它与 Monad/Applicative 实例有关,因为 IO 是 Monad/Applicative/Functor...我说的对吗??
  • 好吧,如果 IO 不适用,那么这显然是行不通的。我不确定 GHCi 如何决定将表达式解释为 IO;显然,它首先尝试将任何类型与IO a 统一起来,并且只有在失败时才会使用仅打印路线。这与 monad 没有任何关系。
猜你喜欢
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
  • 2023-03-11
  • 1970-01-01
  • 1970-01-01
  • 2019-06-30
  • 2019-11-26
相关资源
最近更新 更多