在Haskell中使用 - > a - > a的函数?

nmd*_*mdr 4 haskell

我正在阅读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

思考这个问题的方法,也许是想象我们多少不知道你的论点 aa.

例如,我们不可能说出以下内容:

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)

没有其他有效的方法来表示此功能.


del*_*lta 6

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)