理解Haskells类型签名(例如zip with with(+))
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解Haskells类型签名(例如zip with with(+))相关的知识,希望对你有一定的参考价值。
我有一个关于Haskell中的类型签名的问题,我发现有时候有点难以解决。例如,zipWith
的类型签名是:
zipWith :: (a -> b -> c) -> [a] -> [b] -> [c]
我在这里看到的是zipWith
期望一个函数(参数类型为a
和b
),一个列表与a
s,一个列表与b
s,它给我们一个c
s列表。但是我并不知道为什么我可以使用zipWith
和(+)
,它有签名:
(+) :: a -> a -> a
从我的观点来看,(+)
的签名与(a -> b -> c)
的签名不符。 (+)
只需要a
类型的参数,而(a -> b -> c)
则需要不同类型的参数:a
和b
。任何人都可以给我一个暗示我的错吗?
答案
(a -> b -> c)
表示任何采用a
类型和类型b
并返回类型c
的函数。没有什么可以阻止你使用具有签名(a -> a -> a)
的函数,只是碰巧在这种情况下类型都是相同的。
假设您有一个带有此签名的方法:
zipWith' :: (a -> a -> a) -> [a] -> [a] -> [a]
在这种情况下,您无法使用具有(a -> b -> c)
签名的方法,因为预期的方法签名更具限制性。
以上是关于理解Haskells类型签名(例如zip with with(+))的主要内容,如果未能解决你的问题,请参考以下文章
如何打包安卓手机Zip升级包?如何签名?不换Recovery,用官方Recovery
意外的输入类型。仅支持存档类型,例如 .jar、.zip 等。 Android