【发布时间】:2013-01-02 01:22:41
【问题描述】:
Haskell 新手在这里。我正在通过 Learn you a haskell,并遇到了翻转函数的定义。
flip' :: (a -> b -> c) -> (b -> a -> c)
flip' f = g
where g x y = f y x
我不明白的是,x 和 y 是从哪里来的?我的意思是,签名告诉我flip' 是一个接受一个函数(带有两个参数)并返回一个函数(同样带有两个参数)的函数。
如果我理解这一点,当我编写一个类似的函数时
foo :: (a -> b) -> a -> b
foo f x = f x -- applies the function f on x
但是,在这种情况下,我将显式传递参数 [ 即 x ],因此我可以在函数体中访问它。那么flip'函数怎么可以访问参数x和y呢?
【问题讨论】:
-
你知道
(a -> b) -> a -> b和(a -> b) -> (a -> b)是等价的吗? -
等价因为 -> 运算符关联到右边?类似于我如何将
a -> (b -> c)写为a -> b -> c。 -
没错。我认为看到
foo f x = f x与foo f = f相同(给定相同的类型签名)会有所帮助。无论如何,你提到的那些参数x和y是绑定在g的定义中的,这就是它们的来源。g的定义也可以写成g = (\x y -> f y x)。这意味着flip'也可以定义为flip' f = (\x y -> f y x),相当于flip' f x y = f y x。这在某种程度上与(->)的右关联性有关。
标签: haskell