Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 在GHCi中应用pure-from的怪异行为_Haskell_Ghci_Applicative - Fatal编程技术网

Haskell 在GHCi中应用pure-from的怪异行为

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的类型。但是这

我正在阅读Scott Wlaschin的优秀文章,并运行一些Haskell代码来理解这些概念(
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
,您已经回答了。我想我必须更好地理解类型构造函数才能完全掌握它。然而,你的答案、评论和这篇文章中链接的另一个答案提供了足够的信息,让我们开始了解到底发生了什么。当我弄明白后,我会编辑我的帖子。我现在发烧在床上,所以我把答案写在手机上。等我感觉好一点的时候,我可能会再详细说明一下!