我对Haskell中的类型签名有疑问,我发现有时候有点难以解决。例如,zipWith
的类型签名是:
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
我在这里看到的是zipWith
期望一个函数(参数类型为a
和b
),一个列表a
,列表b
1}}它给了我们一个c
的列表。但是我并没有解释为什么我可以使用zipWith
和(+)
作为签名:
(+) :: a -> a -> a
从我的观点来看,(+)
的签名与(a -> b -> c)
的签名不符。 (+)
只需要a
类型的参数,而(a -> b -> c)
则需要不同类型的参数:a
和b
。任何人都可以给我一个暗示我的错吗?
答案 0 :(得分:4)
(a -> b -> c)
表示采用类型a
和类型b
并返回类型c
的任何函数。
没有什么可以阻止你使用具有签名(a -> a -> a)
的函数,只是在这种情况下,类型都是相同的。
假设您有一个带有此签名的方法:
zipWith' :: (a -> a -> a) -> [a] -> [a] -> [a]
在这种情况下,您无法使用签名为(a -> b -> c)
的方法,因为预期的方法签名更具限制性。