给出一般功能
cons x xs = x:xs
如何给它一般类型?我试着做了
cons:: a -> [b] -> [c]
但它似乎不起作用
答案 0 :(得分:1)
请注意,O(n)
和a
可能是不同的类型,您希望能够在列表中添加b
。因此,您希望两个列表都是a
类型。
[a]
答案 1 :(得分:1)
列表定义为(伪代码):
data [a] = [] | a : [a]
因此,列表只能包含相同类型的元素:它是一个空列表([]
),因此它不包含任何元素,或者它是一个CONS({ {1}})然后头部的类型为:
,其尾部为a
。
因此,如果您定义:
[a]
Haskell看一下构造函数的签名:cons x xs = x : xs
。因此,它得出a : [a]
是x
,a
是xs
,而[a]
也是(x:xs)
( [a]
声明)。
因此,data
的最常见类型签名是:
cons
您无法定义cons :: a -> [a] -> [a]
cons x xs = x : xs
cons
和x :: a
(xs :: [b]
与a
不同),因为在这种情况下您会调用构造函数{{1有冲突的类型。
在Haskell中,您通常不必编写类型签名。如果省略它们,Haskell将填写最通用的一个。您可以在b
交互式shell中使用(:) :: a -> [a] -> [a]
来获取函数的类型。像:
:t
最后请注意,您无需定义ghci
功能,只需使用Prelude> let cons x xs = x : xs
Prelude> :t cons
cons :: a -> [a] -> [a]
:
cons