给定一个通用函数
cons x xs = x:xs
如何给它一个通用类型?我试过做
cons:: a -> [b] -> [c]
但它似乎不起作用
列表定义为(伪代码):
data [a] = [] | a : [a]
因此,列表只能包含相同类型的元素:要么它是一个空列表([]
),所以它不包含任何元素,要么它是一个缺点(:
),然后头部是a
类型,它的尾[a]
也是如此。
因此,如果您定义:
cons x xs = x : xs
Haskell看一下构造函数的签名:a : [a]
。因此,它推导出x
是一个a
,xs
是一个[a]
,(x:xs)
也是一个[a]
(data
语句的头部)。
因此,cons
最通用的类型签名是:
cons :: a -> [a] -> [a]
cons x xs = x : xs
您不能定义具有x :: a
和xs :: [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 = (:)
请记住,a
和b
可能是不同的类型,在这里您希望能够将a
添加到列表中。 因此,您希望两个列表都是类型[a]
。
cons :: a -> [a] -> [a]
cons = (:)