gpt4 book ai didi

haskell - 数据构造函数的部分应用

转载 作者:行者123 更新时间:2023-12-04 23:16:49 24 4
gpt4 key购买 nike

我不明白为什么以下练习在 Haskell 编程中从第一原理“有效”:

type Subject = String
type Verb = String
type Object = String

data Sentence =
Sentence Subject Verb Object
deriving (Eq, Show)

s1 = Sentence "dogs" "drool"
s2 = Sentence "Julie" "loves" "dogs"

将其加载到 ghci 中表明它的类型检查很好,但为什么 s1 的定义甚至有道理吗?我对 Haskell 还是很陌生,所以起初我以为这是因为在 s1 Haskell 隐含地让 Object字符串为空。但是之后...
*Main> s1

<interactive>:13:1:
No instance for (Show (Object -> Sentence))
arising from a use of `print'
Possible fix:
add an instance declaration for (Show (Object -> Sentence))
In a stmt of an interactive GHCi command: print it

我仍在学习如何正确解释这些错误消息,所以请多多包涵。但是谁能解释一下 No instance for (Show (Object -> Sentence))方法?更具体地说,如何省略 Object s1 中的字符串结果是 (Object -> Sentence)事物?

我敢肯定这很容易,但我认为这本书还没有让我在这一点上理解这一点......

最佳答案

but why is it that the definition of s1 even makes sense?



正如@Alec 提到的,它被称为柯里化(Currying)。查看发生了什么的一种方法是让 GHCI 告诉您 s1 的类型。是:
ghci> :t s1
s1 :: Object -> Sentence

所以 s1是一个函数,采用 ObjectSentence .另一种思考方式是从定义开始:
s1 = Sentence "dogs" "drool"

并使用等式推理将两边应用于值 x :
s1 x = Sentence "dogs" "drool" x

所以当你调用 s1 x与调用 Sentence 相同前两个函数参数硬编码为 "dogs""drool" , 和 x成为 Sentence 的第三个参数功能。

can someone explain what "No instance for (Show (Object -> Sentence))" means?



当您在 GHCI 中评估某些内容时,它与向 Haskell 询问 print 基本相同吗?它。那是,
ghci> 3+4

实际上与以下内容相同:
ghci> print (3+4)

(此规则不适用于像 getLine 甚至 print 本身这样的 IO 操作。在这些情况下,Haskell 只运行 IO 操作。)

为了 print该类型必须有一个 Show 实例。
但正如我们在上面看到的, s1Object -> Sentence 类型的函数,并且函数没有预定义的 Show 实例。

请注意, Sentence 有一个 Show 实例。值,因为您要求 GHC 用 deriving (Eq, Show) 推导出一个.因此,当您在 GHCI 提示符下键入时:
ghci> Sentence "Julie" "loves" "dogs"

你回来了:
Sentence "Julie" "loves" "dogs"

因为你真的要求 GHCI 运行 print (Sentence "Julie" "loves" "dogs") .

请注意 print本身定义为 (link) :
print x = putStrLn (show x)

以及调用 show这就是为什么一个值需要为它定义一个 Show 实例才能打印它的原因。

关于haskell - 数据构造函数的部分应用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39239577/

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