首页 > 解决方案 > Haskell 高阶函数类型

问题描述

我现在正在学习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

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

标签: haskellhigher-order-functions

解决方案


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

所以函数定义为:

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 ywhich 必须是 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

如果我们愿意,我们现在可以重命名类型变量,以便它与您给出的签名相匹配 - 但希望您可以看到它们是相同的,而不必这样做。

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


推荐阅读