haskell - Haskell 高阶函数类型
问题描述
我现在正在学习haskell。但我正在为“类型”而苦苦挣扎。
- 例如,
f
函数的类型是
f g (x,y)= g x y
(a -> b -> c) -> (a, b) -> c
- 以下 Haskell 函数 h 的类型
h f g x y = f (g x y) x
(a -> b -> c) -> (b -> d -> a) -> b -> d -> c
我如何理解如何猜测函数的类型?
解决方案
我将引导您完成第一个:希望这能给您足够的想法,您可以自己弄清楚第二个。
所以函数定义为:
f g (x,y)= g x y
f
是我们感兴趣的函数,我们可以从上面看到 - 实际上只是从左侧 - 它需要 2 个参数:g
和 tuple (x,y)
。所以让我们使用一些类型变量:
- 我们将
a
用于类型g
b
对于类型x
c
对于类型y
- 以及给定两个参数时输出
d
的类型。f
这给了我们
f :: a -> (b, c) -> d
此外,这就是我们可以从左侧获得的所有=
信息。我们可以通过查看右侧了解更多信息 - g x y
which 必须是 type d
。
好吧,表达式g x y
本身告诉我们这g
是一个可以接受 2 个参数的函数。此外,我们已经为这些参数以及它的返回值分配了类型(因为这与f g (x,y)
输出的值相同,我们已经说过它具有 type d
)。
全部写出来,我们发现的类型g
是 simple b -> c -> d
。将其替换为f
我们上面写下的类型,我们得到:
f :: (b -> c -> d) -> (b, c) -> d
如果我们愿意,我们现在可以重命名类型变量,以便它与您给出的签名相匹配 - 但希望您可以看到它们是相同的,而不必这样做。
正如我所说,虽然涉及的更多一些,但第二个练习可以使用完全相同的逻辑来解决。
推荐阅读
- php - 优化 mysql 查询以减少搜索的行数
- excel - 使用VBA替换字符串中特定位置的文本
- javascript - Javascript中的密封对象和检查对象的类型
- javascript - 使用 oath 时 Amplify.Hub 登录处理程序中的竞争条件
- java - 如何使用 Hibernate 在实体内部映射实体集合?
- python - 在 Python 中控制小数而不是有效数字
- node.js - 如何拥有安全的 MongoDB - Mongoose 设置?
- c# - 如何通过考虑时间来计算两个给定日期之间的周末(以分钟为单位)
- c# - 在 .NET Core Worker 服务中执行健康检查
- javascript - 从 Json 中查找数组 obj 的名称