我正在学习haskell。 但是我在为“类型”而苦苦挣扎。
f
函数的类型是 f g (x,y)= g x y
(a -> b -> c) -> (a, b) -> c
h f g x y = f (g x y) x
(a -> b -> c) -> (b -> d -> a) -> b -> d -> c
我如何理解如何猜测函数的类型?
答案 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
如果需要的话,我们现在可以重命名类型变量,以使其与您提供的签名相匹配-但希望您可以看到它们是相同的,而不必这样做。
正如我说的,虽然涉及的程度稍微多一点,但是可以使用完全相同的逻辑解决第二个练习。