理解Haskells类型签名(例如zip with with(+))

时间:2014-01-01 14:59:16

标签: haskell signature type-signature

我对Haskell中的类型签名有疑问,我发现有时候有点难以解决。例如,zipWith的类型签名是:

zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]

我在这里看到的是zipWith期望一个函数(参数类型为ab),一个列表a,列表b 1}}它给了我们一个c的列表。但是我并没有解释为什么我可以使用zipWith(+)作为签名:

(+) :: a -> a -> a

从我的观点来看,(+)的签名与(a -> b -> c)的签名不符。 (+)只需要a类型的参数,而(a -> b -> c)则需要不同类型的参数:ab。任何人都可以给我一个暗示我的错吗?

1 个答案:

答案 0 :(得分:4)

(a -> b -> c)表示采用类型a和类型b并返回类型c的任何函数。 没有什么可以阻止你使用具有签名(a -> a -> a)的函数,只是在这种情况下,类型都是相同的。

假设您有一个带有此签名的方法:

zipWith' :: (a -> a -> a) -> [a] -> [a] -> [a]

在这种情况下,您无法使用签名为(a -> b -> c)的方法,因为预期的方法签名更具限制性。