我在理解仿函数时遇到问题,特别是 LYAH 中的具体类型。我相信这是因为我不明白 []
真的是。
fmap :: (a -> b) -> f a -> f b
[]
,类型构造函数?或者,它是一个值构造函数吗? [] :: [a]
? Maybe
类型构造函数,或 Just
值构造函数? Just
那怎么来Just
有一个像 Just :: a -> Maybe a
这样的签名而不是 Just :: Maybe a
,换句话说,为什么不是 []
输入 [] :: a -> [a]
fmap :: (a -> b) -> f a -> f b
,我们看到 f 必须是一个接受一种类型的类型构造函数。 [a]
已经是一个具体类型(其中包含任何类型的列表),而 []
是一个类型构造函数,它采用一种类型并且可以产生诸如 [Int]
之类的类型。 , [String]
甚至[[String]]
.我对 []
的类型感到困惑暗示它就像 [a]
的文字LYAH 想要达到什么目的? 最佳答案
该类型(在 GHCI session 中)描述为:
$ ghci
Prelude> :info []
data [] a = [] | a : [a] -- Defined
我们也可以将其视为定义为:
data List a = Nil
| Cons a (List a)
或者
data List a = EmptyList
| ListElement a (List a)
类型构造器
[a]
是一种多态数据类型,也可以写成[] a
如上。这可能被认为是 List a
在这种情况下,
[]
是一个类型构造函数,带有一个类型参数 a
并返回类型 [] a
, 也可以写成 [a]
.可以编写如下函数的类型:
sum :: (Num a) => [a] -> a
数据构造器
[]
是一个数据构造函数,本质上意味着“空列表”。此数据构造函数不接受值参数。还有另一个数据构造函数,
:
,它将一个元素添加到另一个列表的前面。此数据构造函数的签名是 a : [a]
- 它接受一个元素和另一个元素列表,并返回一个结果元素列表。[]
符号也可以用作构造列表的简写。通常我们会构建一个列表:myNums = 3 : 2 : 4 : 7 : 12 : 8 : []
这被解释为
myNums = 3 : (2 : (4 : (7 : (12 : (8 : [])))))
但是 Haskell 也允许我们使用速记
myNums = [ 3, 2, 4, 7, 12, 8 ]
作为含义上的等价物,但在外观上稍微好一点,符号。
暧昧案例
有一种常见的模棱两可的情况:
[a]
.根据上下文,此表示法可以表示“a
的列表”或“只有一个元素的列表,即 a
”。第一个含义是 [a]
时的预期含义。出现在一个类型中,而第二个含义是 [a]
时的预期含义。出现在一个值内。
关于list - Haskell 中的 [] (列表构造函数)是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2270277/