gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:13:18 25 4
gpt4 key购买 nike

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

示例。我有一个二元函数,例如:

sub :: Int -> Int -> Int
sub x y = x - y

现在,如果我想绑定(bind)第一个参数,我可以使用 (sub someExpression) 轻松完成:

mapSubFrom5 x = map (sub 5) x

*Main> mapSubFrom5 [1,2,3,4,5]
[4,3,2,1,0]

如果我想在没有“间隙”的情况下绑定(bind)前 n 个参数,那么效果很好。

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

通过另一个本地函数:

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”的优雅,并且想知道是否有一种类似优雅的方式来绑定(bind)函数的第 n (n > 1) 个参数?

最佳答案

flip 生成一个前两个参数相反的新函数,已经被提及为一种直接的解决方案。

但是,值得注意的是 Haskell 为二元运算符定义了一个很好的中缀语法。

首先,很简单

sub = (-)

加上括号,所有运算符在语法上都是普通函数。现在我们可以使用一些特殊的语法来柯里化(Currying)运算符。绑定(bind)到第一个操作数:

addOne = (1 +)

...到第二个

half = (/ 2)

这样你的代码就变成了

map (-5) [1..5]

不幸的是,-5 是一个数字文字,但你明白了。 :) 现在我们可以通过在函数周围加上反引号将任何函数转换为二元运算符,就像

f x y == x `f` y

我们可以使用这种特殊的运算符语法来编写

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

<小时/> 注意: 柯里化(Currying)第一个参数很常见,第二个参数 - 正如您的情况 - 很有可能。但是:为了进一步的争论,我不会这样做。 Haskell 函数的编写风格正是出于这个原因,常见的柯里化(Currying)函数位于前面。

使用一些特殊的语法来进行进一步的参数对我来说感觉太隐晦了。只需使用 lambda 并为变量提供描述性名称即可。

关于haskell - 如何绑定(bind)函数中的第二个参数而不是第一个参数(以优雅的方式)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4553405/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com