gpt4 book ai didi

function - Haskell 类型的构造函数 'just' 是函数吗?

转载 作者:行者123 更新时间:2023-12-03 18:28:58 25 4
gpt4 key购买 nike

我正在阅读“从第一原理开始的 Haskell 编程”,并找到了一个练习,询问以下 [此处稍微编辑的代码] 是否有效:

module Test where

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

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

a1 = Sentence "I" "like" "cheese"
a2 = Sentence "I" "scream"
我最初的预期是代码会失败,因为在 a2 的定义中, Sentence只有两个论点。但是发现GHCi很乐意加载模块。我做了一些实验,发现我现在可以打字了
a3 = a2 "icecream"
a3 (输入 GHCi)将打印 Sentence "I" "scream" "icecream" .另外,如果我查询 的类型a2 我得到 a2 :: Object -> Sentence .所以如果我理解正确, a2行为与部分应用的函数完全一样。
因此,问题是:类型构造函数在所有情况下真的只是一个函数(返回一个类型值)吗?与“普通”函数的区别仅在于它必须以大写字符开头?

最佳答案

首先,你在这里说的是数据 构造函数,而不是类型构造函数。该示例恰好包含(空)类型构造函数Sentence。和一个三元数据构造函数Sentence .为了明确哪个是哪个:

data SentenceTC = SentenceDC Subject Verb Object
SentenceTC是一个类型构造函数, SentenceDC是一个数据构造函数。
所以,问题是:

Is SentenceDC just a function?


答案是,它是一个函数,而不是“只是”一个函数。它具体是一个 injective function ,即每个参数组合都会导致不同的结果。因此,总是可以从结果 SentenceTC 中推断出它是哪些参数。值(value)。这就是在构造函数上进行模式匹配时发生的情况。
a1Verb :: Verb
a1Verb = case a1 of
Sentence _ v _ -> v
这对于一般功能来说是不可能的,比如
n' :: Int
n' = abs n
where n = -3

nNew :: Int
nNew = case n' of
abs n -> n -- error, `abs` can not be used as a pattern match
这也没有任何意义,因为实际上有两个不同的数字 abs等于 n' (即 -33 )。
但是,是的, SentenceDC是一个函数,你可以用它做任何你可以用其他类型的函数做的事情 String -> String -> String -> SentenceTC .但不是相反:不是所有你可以用数据构造器做的事情也可以用相同类型的通用函数来完成。

关于function - Haskell 类型的构造函数 'just' 是函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67702482/

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