这是《第一原理的Haskell编程》一书中的一个问题。
我正在阅读上面提到的书,关于练习2,第5章,参数化。
从书中复制。
我们可以更舒适地了解参数 通过查看-> a-> a。这个假设 函数a-> a-> a具有两个并且只有两个实现。
我不理解“仅两个实现”部分?谁能向我解释为什么只有两个实现?
答案 0 :(得分:13)
我认为乍一看,“实现”一词可能会有些混乱。
假设我们只有 个函数类型f :: a -> a -> a
,没有其他信息;我们不允许窥视f
。该函数必须返回一个a
,并且您只有2个可能的a
作为输入。因此,该函数必须返回第一个a
或第二个a
;只有2种可能的功能。
您不能拥有f x y = x + y
,因为您不知道如何+
仅凭两个a
f :: a -> a -> a
。如果有h :: Int -> Int -> Int
,则h x y = x + y
将是有效函数,但不会为您提供f
的信息。
类似地,如果您有f :: a -> a -> a
并且声称f x y = x + y
有效,该怎么办。然后,我可以通过向Fruit
传递两个f
:f Apple Orange = ???
来打破您的要求。 Apple + Orange
不明确,代码无法正常工作。因此,保持类型多态类型将可能的功能“限制”为2个可能的“实现”:f x y = x
或f x y = y
。
这个video帮助我理解了。我会推荐整个视频,但链接是指向相关部分的。 (31:28)
它演示了类型级推理和参数化的强大功能。此类推理的所有信息都在类型中。
另一个例子,假设您所拥有的只是函数类型g :: b -> b
。好的,该函数必须返回一个b
,并且唯一的参数是一个b
,因此它必须返回 that b
。因此,只有一个类型为b -> b
的函数。