Haskell 在GHCi中应用pure-from的怪异行为
我正在阅读Scott Wlaschin的优秀文章,并运行一些Haskell代码来理解这些概念(Haskell 在GHCi中应用pure-from的怪异行为,haskell,ghci,applicative,Haskell,Ghci,Applicative,我正在阅读Scott Wlaschin的优秀文章,并运行一些Haskell代码来理解这些概念(Functor,Applicative,…)。我偶然发现了一种我不理解的行为 为什么计算pure add1什么也不打印?计算表达式的值是多少?为什么pure add1“abc”将函数add1返回给我 我知道,pure将一个值提升到提升的世界(本文中称之为)。由于我没有在某个地方提供具体的提升值或足够的类型信息,因此类型约束是通用的,并且保持Applicative f。因此,我理解纯add1的类型。但是这
Functor
,Applicative
,…)。我偶然发现了一种我不理解的行为
为什么计算pure add1
什么也不打印?计算表达式的值是多少?为什么pure add1“abc”
将函数add1
返回给我
我知道,pure
将一个值提升到提升的世界(本文中称之为)。由于我没有在某个地方提供具体的提升值或足够的类型信息,因此类型约束是通用的,并且保持Applicative f
。因此,我理解纯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
$stack ghci
GHCi,版本8.8.2
λ:add1::Int->Int;加1 x=x+1
λ::t add1
add1::Int->Int
λ:add1 100
101
λ::t纯
纯::应用f=>a->f a
λ:纯add1
λ::t纯add1
纯add1::Applicative f=>f(Int->Int)
λ:纯add1“abc”
:8:1:错误:
•没有因使用“打印”而产生的(显示(Int->Int))实例
(可能您没有对足够的参数应用函数?)
•在交互式GHCi命令的stmt中:打印它
λ::t纯加1“abc”
纯add1“abc”::Int->Int
λ:纯add1“abc”100
101
编辑
我认为@chi的两条评论和@sarah的回答回答了这个问题,因为它显示了GHCi选择用于评估表达式的应用程序,并解释了观察到的行为。因为您将表达式
纯add1
应用于值“abc”
,应用程序实例被挑选为(>)字符串的实例。在该实例中,pure=const
,因此您的最终表达式是const add1“abc”
,它是add1
,没有Show实例 看起来与相同的问题,但它不允许我理解纯add1“abc”
。不,我认为这是一个不同的问题:如果它是相同的,你将有纯add1::IO(Int->Int)
,这不允许你做纯add1“abc”100
。但我必须说,这种行为看起来不可思议——我当然不知道该如何解释。IO在GHCi中受到特殊处理。您的纯add1
被视为类型为IO(Int->Int)
的值,因此它会运行(无效)。它的最终结果(add1
)则不会打印,因为它不可Show
显示。相比之下,试试pure“hello”
,它是一个IO字符串,在末尾打印它的值。@chi如果这是真的,pure add1“abc”
将不会键入check。问题中没有涉及IO的代码,除了隐式的打印它
。看我的answer@sara当您在GHCi中输入pure add1
时,它将在IO中解释。当您输入pure add1 something
,这将在(>)a
应用程序中解释。GHCi的magic尽可能在顶层使用IO:在前一种情况下是,在后一种情况下不是。好的,我将尝试处理:-)请注意,显示错误不是问题,因为它是一个默认情况下没有显示实例的函数。也许我不该把它留下。我的问题是constadd1“abc”
给出了add1
,您已经回答了。我想我必须更好地理解类型构造函数才能完全掌握它。然而,你的答案、评论和这篇文章中链接的另一个答案提供了足够的信息,让我们开始了解到底发生了什么。当我弄明白后,我会编辑我的帖子。我现在发烧在床上,所以我把答案写在手机上。等我感觉好一点的时候,我可能会再详细说明一下!