Haskell 基金会项目类型的目的是什么? 以下两种方法均以基础和序列式作为合格的导入P进行编译,并返回预期字符串。 -- the inferred type blahhh :: Item [Char] blahhh = P.head $ toList ("blahh de blahh de blahh" :: [Item [Char]]) blahh2 :: [Char] blahh2 = blahhh : ": Should be a b"

Haskell 基金会项目类型的目的是什么? 以下两种方法均以基础和序列式作为合格的导入P进行编译,并返回预期字符串。 -- the inferred type blahhh :: Item [Char] blahhh = P.head $ toList ("blahh de blahh de blahh" :: [Item [Char]]) blahh2 :: [Char] blahh2 = blahhh : ": Should be a b",haskell,types,Haskell,Types,及 一开始我觉得有点困惑。我最初认为列表中有一些需要模式匹配的项数据类型 然后,我意识到Item从列表中提取项目类型,如文档所示,因此Item[Char]==Char 我的问题是,这个项目和类似类型的项目的目的是什么?额外的复杂性给你带来了什么?你说得对,当使用[Char]时,该项只会增加复杂性。然而,项目背后的想法是,它也可以用于其他类型。例如,项数组ty为ty,项CSV为Row,项位图为Bool等。这使得我们的函数更具多态性,因此可以更广泛地使用它们:例如,从列表中选取::[Item l]-

一开始我觉得有点困惑。我最初认为列表中有一些需要模式匹配的项数据类型

然后,我意识到Item从列表中提取项目类型,如文档所示,因此Item[Char]==Char

我的问题是,这个项目和类似类型的项目的目的是什么?额外的复杂性给你带来了什么?

你说得对,当使用[Char]时,该项只会增加复杂性。然而,项目背后的想法是,它也可以用于其他类型。例如,项数组ty为ty,项CSV为Row,项位图为Bool等。这使得我们的函数更具多态性,因此可以更广泛地使用它们:例如,从列表中选取::[Item l]->l,根据l是什么,它可以在以下任何情况下使用:

它比从ListArray、fromRowsCSV等拥有一堆函数更容易使用。

项不是一个普通的类型,而是一个命名不好的类型同义词族,这是一种类型级函数。类型实例项[a]=您看到的aas意味着您可以将项[a]的类型签名中出现的情况替换为a,这与函数声明snd u非常相似,y=y意味着您可以将snd 1,2替换为2

项目a的要点是,它允许您编写关于参数a的通用代码。或者更确切地说,它允许您表达这样一个函数的类型

通常,对于这样的类型同义词族来说,它需要与类型类配对:后者允许您在不同类型上定义不同的行为,前者允许(比如)输出类型依赖于输入的类型。多参数类型类+函数依赖实现了相同的目标

有时,由于上面段落中描述的关系,当类型族被定义为类型类的一部分时,它们又被混淆地称为关联类型,但这是一个肤浅的语法问题

传统上,类型族像类型类一样是开放的,但现在有了封闭的类型族,这有助于递归

blahhh :: Char
blahhh = P.head $ toList ("blahh de blahh de blahh" :: [Char])

blahh2 :: [Char]
blahh2 = blahhh : ": Should be a b"
fromList :: [a]    -> [a]
fromList :: [ty]   -> Array ty
fromList :: [Row]  -> CSV
fromList :: [Bool] -> Bitmap