我正在阅读Haskell编程书和第140页的练习,作者说:
A hypothetical function a->a->a has two possible implementations. Write both possible versions.
我假设a -> a -> a 将暗示一个带有两个参数的函数(a and a)- (这对我来说没有意义,如果我声明一个带有两个args的函数a,ghci也正确地抱怨)并且返回a
我想我错过了什么,它是什么?
ere*_*wok 10
思考这个问题的方法,也许是想象我们多少不知道你的论点 a和a.
例如,我们不可能说出以下内容:
someFunc :: a -> a -> a
someFunc x y = x == y
Run Code Online (Sandbox Code Playgroud)
这不会进行类型检查,因为我们甚至不知道是否a是类型类的实例Eq.换句话说,a除了它们是相同类型的东西(无论可能是什么)之外,我们没有关于这些东西的有用信息.
考虑身份功能:
ident :: a -> a
ident x = ...
Run Code Online (Sandbox Code Playgroud)
这个函数没有什么可以知道它唯一的论点x.因此,只有一个可能的有效结果:
ident x = x
Run Code Online (Sandbox Code Playgroud)
没有别的东西可以工作,因为我们没有其他任何东西可以假设我们的论点.
现在,在您的情况下,您有两个参数,这些参数绝对可以是宇宙中的任何参数.关于这两个参数可以遵循的任何行为,我们都无法做出断言.因此,我们可以用两种不同的方式定义我们的函数:
someFunc1 :: a -> a -> a
someFunc1 x y = x
Run Code Online (Sandbox Code Playgroud)
要么
someFunc2 :: a -> a -> a
someFunc2 x y = y
Run Code Online (Sandbox Code Playgroud)
没有其他有效的方法来表示此功能.
let f :: a -> a -> a,因为对类型没有限制a,唯一可能的2个实现就是返回1st/2nd参数,即
f x _ = x
Run Code Online (Sandbox Code Playgroud)
要么
f _ x = x
Run Code Online (Sandbox Code Playgroud)