Haskell高阶函数类型

时间:2019-11-01 18:10:23

标签: haskell higher-order-functions

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

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

1 个答案:

答案 0 :(得分:4)

我将引导您完成第一个:希望您能给您足够的想法,让您自己找出第二个。

所以函数定义是:

f g (x,y)= g x y

f是我们感兴趣的函数,从上面可以看到-实际上只是从左侧-它需要两个参数:g和元组{{ 1}}。因此,让我们使用一些类型变量:

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

这给了我们

f

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

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

全部删除,我们发现d的类型就是g。用上面记下的b -> c -> d类型替换为:

f

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

正如我说的,虽然涉及的程度稍微多一点,但是可以使用完全相同的逻辑解决第二个练习。