Haskell:将元素推送到列表的一般函数类型

时间:2017-05-21 15:32:41

标签: haskell

给出一般功能

cons x xs = x:xs

如何给它一般类型?我试着做了

cons:: a -> [b] -> [c]

但它似乎不起作用

2 个答案:

答案 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]xaxs,而[a]也是(x:xs)[a]声明)。

因此,data的最常见类型签名是:

cons

您无法定义cons :: a -> [a] -> [a] cons x xs = x : xs consx :: axs :: [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