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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了理解Haskells类型签名(例如zip with with(+))相关的知识,希望对你有一定的参考价值。

我有一个关于Haskell中的类型签名的问题,我发现有时候有点难以解决。例如,zipWith的类型签名是:

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

我在这里看到的是zipWith期望一个函数(参数类型为ab),一个列表与as,一个列表与bs,它给我们一个cs列表。但是我并不知道为什么我可以使用zipWith(+),它有签名:

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

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

答案

(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

Android深入理解JNI类型转换方法签名和JNIEnv

意外的输入类型。仅支持存档类型,例如 .jar、.zip 等。 Android

Android Studio 错误没有方法签名:

使用 .Net 对 zip 文件进行数字签名以供下载的最佳方式是啥

[Journey with golang] 4. Interface