【问题标题】:Haskell Higher order function TypeHaskell 高阶函数类型
【发布时间】:2026-01-04 16:30:01
【问题描述】:

我现在正在学习haskell。 但我正在为“类型”而苦苦挣扎。

  1. 例如, f 函数的类型是

f g (x,y)= g x y

(a -> b -> c) -> (a, b) -> c

  1. 以下 Haskell 函数 h 的类型

h f g x y = f (g x y) x

(a -> b -> c) -> (b -> d -> a) -> b -> d -> c

我如何理解如何猜测函数的类型?

【问题讨论】:

  • 为什么叫它“猜测”?不涉及猜测。
  • 但更具建设性:您是否尝试过自己弄清楚类型必须是什么? (从第一个开始,因为它更容易,尽管两者都适用完全相同的推理。)例如,关于第一个参数g 的类型,你能说多少?
  • 类型签名非常清晰。 f :: (a -> b -> c) 这意味着f 的第一个参数是a 类型,g 的返回值必须是a 类型。 f 的第二个参数xb 类型,它产生g 的第一个参数,它也是x 成为b 类型,它产生g 来获取一个类型像(b -> d -> a) 这样的签名,而类型参数d 分配给函数hy 参数。所以h函数的类型原来是(a -> b -> c) -> (b -> d -> a) -> b -> d -> c

标签: haskell higher-order-functions


【解决方案1】:

我将引导您完成第一个:希望这能给您足够的想法,您可以自己弄清楚第二个。

所以函数定义为:

f g (x,y)= g x y

f 是我们感兴趣的函数,我们可以从上面看到——实际上只是从左侧开始——它有两个参数:g 和元组(x,y)。所以让我们使用一些类型变量:

  • 我们将使用a 作为g 的类型
  • b 用于 x 的类型
  • c 用于 y 的类型
  • d 表示f 在给定两个参数时输出的类型。

这给了我们

f :: a -> (b, c) -> d

这就是我们可以从= 左侧获得的所有信息。我们可以通过查看右侧了解更多信息 - g x y,其类型必须为 d

g x y 表达式本身告诉我们g 是一个可以接受 2 个参数的函数。此外,我们已经为这些参数及其返回值分配了类型(因为这与f g (x,y) 输出的值相同,我们已经说过它的类型为d)。

写出来,我们发现g的类型就是b -> c -> d。将其替换为我们在上面写下的f 类型,我们得到:

f :: (b -> c -> d) -> (b, c) -> d

如果我们愿意,我们现在可以重命名类型变量,以便与您获得的签名相匹配 - 但希望您无需这样做就可以看到它们是相同的。

正如我所说,虽然涉及的内容稍微多一些,但第二个练习可以使用完全相同的逻辑来解决。

【讨论】:

  • 谢谢我用同样的逻辑找到第二个!
最近更新 更多