GHCi 中 Applicative 的 pure 的奇怪行为
Weird behaviour of pure from Applicative in GHCi
我正在阅读 Scott Wlaschin 的优秀文章 Understanding map and apply 和 运行 一些 Haskell 代码来理解概念(Functor
、Applicative
、. ..).我偶然发现了一个我不理解的行为。
为什么计算 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 实例!
我正在阅读 Scott Wlaschin 的优秀文章 Understanding map and apply 和 运行 一些 Haskell 代码来理解概念(Functor
、Applicative
、. ..).我偶然发现了一个我不理解的行为。
为什么计算 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 实例!