gpt4 book ai didi

haskell - GHCi 如何打印从 "pure"创建的部分应用值?

转载 作者:行者123 更新时间:2023-12-02 18:23:24 25 4
gpt4 key购买 nike

我一直在研究 Applicative 实例,以便弄清楚它们是如何工作的。不过,老实说我不理解这种行为。

如果我定义自己的数据类型,然后在没有其他参数的情况下对其应用pure,则不会打印任何内容,但如果我尝试对结果应用某些内容,则会出错。

ghci> data T = A
ghci> pure A
ghci> pure A 0

<interactive>:21:1:
No instance for (Show T) arising from a use of ‘print’
In a stmt of an interactive GHCi command: print it

但是,如果我将 T 设为 Show 的实例,则在两种情况下都会打印出 A

ghci> data T = A deriving (Show)
ghci> pure A
A
ghci> pure A 0
A

我真正不明白的是,pure A 如何成为在两种情况下以不同方式打印的值。 纯 A 不是部分应用了吗?

我确实理解为什么在第一个示例中调用 pure A 0 会出错,而在第二个示例中却不会,这对我来说很有意义。这是使用 Applicative((->) r) 实例,因此它只是生成一个始终返回 A 的函数。

但是,当应用程序本身的类型未知时,如何仅使用一个值实例化 pure 呢?此外,GHC 怎么可能打印这个值?

最佳答案

GHCi 有点奇怪。特别是,当您在提示符下键入表达式时,它会尝试按顺序以两种不同的方式解释它:

  1. 作为IO要执行的操作。
  2. 作为要打印的值。

IOApplicative ,它正在解释pure A作为IO产生某种类型的 Action T 。它执行该操作(不执行任何操作),并且由于结果不在 Show 中,它不会打印任何内容。如果你做T Show 的一个实例,然后它会为您打印出结果。

当你写pure A 0时,GHCi 看到了这个:

pure :: Applicative f => a -> f a
pure A :: Applicative f => f T

既然你申请了pure A0 , pure A必须是一个函数a->b对于某些类型ab ,和a必须包含0 .

(Num a, Applicative f) => f T ~ (a -> b)

(请注意,x ~ y 意味着 xy 统一——它们可以具有相同的类型。)

因此我们必须有 f ~ ((->) a)T ~ b ,所以实际上 GHC 推断,在这种情况下,

pure A :: Num a => ((->) a) T

我们可以重写为

pure A :: Num a => a -> T

嗯,(->) aApplicative 的一个实例,即“读者”,所以这是可以的。当我们申请pure A0我们得到 T 类型的东西,即A 。这不能被解释为 IO行动,当然,所以如果 T不是 Show 的实例,GHCi 会提示。

关于haskell - GHCi 如何打印从 "pure"创建的部分应用值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28978857/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com