GHCi 中 Applicative 的 pure 的奇怪行为

Weird behaviour of pure from Applicative in GHCi

我正在阅读 Scott Wlaschin 的优秀文章 Understanding map and apply 和 运行 一些 Haskell 代码来理解概念(FunctorApplicative、. ..).我偶然发现了一个我不理解的行为。

为什么计算 pure add1 什么都不打印?求值表达式的值是多少?为什么 pure add1 "abc" 返回函数 add1

我理解 pure 将价值提升到更高的世界(文章中如此称呼)。由于我没有在某处提供具体的提升值或足够的类型信息,因此类型约束是通用的并保持 Applicative f。因此我理解了 pure add1 的类型。但是这里发生的其他事情让我难以理解。

$ stack ghci
GHCi, version 8.8.2
λ: add1 :: Int -> Int ; add1 x = x + 1
λ: :t add1
add1 :: Int -> Int
λ: add1 100
101
λ: :t pure
pure :: Applicative f => a -> f a
λ: pure add1
λ: :t pure add1
pure add1 :: Applicative f => f (Int -> Int)
λ: pure add1 "abc"

<interactive>:8:1: error:
    • No instance for (Show (Int -> Int)) arising from a use of ‘print’
        (maybe you haven't applied a function to enough arguments?)
    • In a stmt of an interactive GHCi command: print it
λ: :t pure add1 "abc"
pure add1 "abc" :: Int -> Int
λ: pure add1 "abc" 100
101

编辑 我认为@chi 的两条评论和@sarah 的回答回答了这个问题,因为它显示了 GHCi 选择的应用程序来评估表达式并解释了观察到的行为。

由于您将表达式 pure add1 应用于值 "abc",因此 Applicative 实例被选为 (->) String 的实例。在那种情况下,pure = const,所以您的最终表达式是 const add1 "abc",即 add1,它没有 Show 实例!