Haskell:将元素推送到列表的函数的常规类型



给定一个通用函数

cons x xs = x:xs

如何给它一个通用类型?我试过做

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

但它似乎不起作用

列表定义为(伪代码):

data [a] = [] | a : [a]

因此,列表只能包含相同类型的元素:要么它是一个空列表([]),所以它不包含任何元素,要么它是一个缺点(:),然后头部是a类型,它的尾[a]也是如此。

因此,如果您定义:

cons x xs = x : xs

Haskell看一下构造函数的签名:a : [a]。因此,它推导出x是一个axs是一个[a](x:xs)也是一个[a](data语句的头部)。

因此,cons最通用的类型签名是:

cons :: a -> [a] -> [a]
cons x xs = x : xs

您不能定义具有x :: axs :: [b](a不同于b)的cons,因为在这种情况下,您将(:) :: a -> [a] -> [a]冲突的类型调用构造函数。

在 Haskell 中,您通常不必编写类型签名。如果你省略它们,Haskell将填写最通用的。可以使用ghci交互式 shell 中的:t来获取函数的类型。喜欢:

Prelude> let cons x xs = x : xs
Prelude> :t cons
cons :: a -> [a] -> [a]

最后注意你不需要定义一个cons函数,你可以简单地使用(:)

cons :: a -> [a] -> [a]
cons = (:)

请记住,ab可能是不同的类型,在这里您希望能够将a添加到列表中。 因此,您希望两个列表都是类型[a]

cons :: a -> [a] -> [a]
cons = (:)

最新更新