Haskell 高阶函数类型

Haskell Higher order function Type

我正在学习haskell。 但我正在为 'Type' 苦苦挣扎。

  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

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

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

所以函数定义为:

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 个参数的函数。此外,我们已经为这些参数及其 return 值分配了类型(因为这与 f g (x,y) 输出的值相同,我们已经说过它的类型为 d)。

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

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

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

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