Haskell 如何绑定函数中的第二个参数而不是第一个参数(以优雅的方式)?

Haskell 如何绑定函数中的第二个参数而不是第一个参数(以优雅的方式)?,haskell,functional-programming,Haskell,Functional Programming,Haskell中有没有一种方法可以在不使用lambda函数或定义另一个“局部”函数的情况下绑定函数的第二个参数而不是第一个参数 例如。我有一个二进制函数,如: sub :: Int -> Int -> Int sub x y = x - y 现在,如果我想绑定第一个参数,我可以很容易地使用(subsomexpression): 如果我想绑定前n个参数而不使用“gap”,那么这很好 如果我想绑定第二个参数而不是第一个参数,我知道的两个选项更详细: 通过另一个本地功能: mapSub

Haskell中有没有一种方法可以在不使用lambda函数或定义另一个“局部”函数的情况下绑定函数的第二个参数而不是第一个参数

例如。我有一个二进制函数,如:

sub :: Int -> Int -> Int
sub x y = x - y 
现在,如果我想绑定第一个参数,我可以很容易地使用(subsomexpression):

如果我想绑定前n个参数而不使用“gap”,那么这很好

如果我想绑定第二个参数而不是第一个参数,我知道的两个选项更详细:

通过另一个本地功能:

mapSub5 x = map sub5 x
    where sub5 x = sub x 5

*Main> mapSub5 [1,2,3,4,5]
[-4,-3,-2,-1,0]
或使用lambda:

mapSub5 x = map (\x -> sub x 5) x

虽然两者都很好,但我喜欢“sub 5”的优雅,并想知道是否有类似的优雅方式来绑定函数的第n个(n>1)参数?

如何绑定第二个参数:

div2 = flip div 2

ghci> div2 10
5
在你的情况下,你可以写作

ghci> map (flip (-) 5) [1..5]
[-4,-3,-2,-1,0]

注意,在Haskell中,您可以以前缀形式编写操作符,如
(-
)。这与您问题中的
sub
相同。

对于n=2,只有另一种绑定方式:

mapSub5 x = map (`sub` 5) x

flip
,它产生了一个新函数,前两个参数是反向的,已经被提到是一个严格的解决方案

然而,值得注意的是,Haskell为二进制运算符定义了一个很好的中缀语法

首先,这很简单

sub = (-)
在括号中,所有运算符在语法上都是非常普通的函数。现在我们可以用一些特殊的语法来修饰运算符。绑定到第一个操作数:

addOne = (1 +)
。。。第二个呢

half = (/ 2)
因此,您的代码变得

map (-5) [1..5]
不幸的是,
-5
是一个数字文字,但你明白了。)现在,因为我们可以通过在任何函数周围加上反勾号将其转换为二进制运算符,就像

f x y == x `f` y
我们可以使用这种特殊的运算符语法来编写

map (`sub` 5) [1..5]

注意:将第一个参数套用是很常见的,第二个参数(如您的情况)很可能套用。但是:为了进一步的争论,我不会这么做。Haskell函数是以一种风格编写的,而常用的curry函数正是出于这个原因而出现在前面


对我来说,使用一些特殊的语法来进行进一步的论证感觉太含蓄了。只需使用lambda并给出变量的描述性名称

(我知道(-).sub只是一个简单的示例函数)感谢您指向flip。这至少对第二个参数的情况有效。虽然我想我发现/lambda方法更详细,可读性更强。因为
-5
是一个数字,haskell制造商甚至添加了一个
subtract
函数,该函数被定义为
subtract=flip(-)
,以便您可以编写
映射(subtract 5)
。不过,它更具可读性。另外,最后一点的推论是:如果您经常想将以后的参数部分应用于您自己编写的函数,请毫不犹豫地直接更改顺序!一个函数有三个或三个以上的参数都可能以这种方式使用,这种情况相对少见。
map (`sub` 5) [1..5]