如何将第二个参数传递给接受3个参数的Haskell函数?

ippsafx7  于 2023-10-19  发布在  其他
关注(0)|答案(2)|浏览(130)

我现在正在学习Haskell,我只是对这个很好奇。例如:

minus :: Int -> Int -> Int -> Int
minus x y z = x - y - z

如果我想先把y而不是x传递给函数[minus]呢?我想要一个函数[-x5 z]我不想要这个

minusy10 x z = minus x 10 z

如果我必须定义一个新函数来实现这一点,我觉得它失去了一些“Haskell优雅”。

sczxawaw

sczxawaw1#

您的minus10是一种非常惯用的方法;这通常被绑定在where子句中,这样它就不会扰乱顶级API。flip minus 10(minus10)也是常见的选择。这两个选项只适用于填充 * 第二个 * 参数;更一般地说,为了填充第 n 个参数,RIDAS更好地泛化,如\x -> minus x 10

n1bvdmb6

n1bvdmb62#

从根本上说,您是在问如何编写minusy10而不显式地命名其参数。而且,很明显,你也不想通过将它们移动到lambda中来作弊:

minusy10 = \x z -> minus x 10 z

你想做的是以“无点风格”编写minusy10
在这种情况下,这很容易做到,就像在另一个答案中所建议的那样,但是在更一般的情况下,你可能想引用pointfree.io,它会给你给予一种可能的方法(但是可能存在更多)来编写无点风格的函数。
在这个特定的情况下,它得出了解决方案flip minus 10(这可能不是最可读的一个;我会叫(minus10)更可读,而不是)。
另一方面,关于你的感觉,
如果我必须定义一个新函数来实现这一点,我觉得它失去了一些“Haskell优雅”
值得注意的是,如果过度使用,无点样式可能会降低可读性。事实上,即使是非常简单的函数,你可以在眨眼之间阅读和理解,比如这个,

f x y = x + y*y

point-free风格可能会导致与可读性相反的东西(实际上甚至更长!):

f = (. join (*)) . (+)

所以我想说,在无积分风格和“全积分”(?)风格。这种平衡在哪里?在我看来,应该以最大的 * 可读性 * 为目标,这与“解析性”不同。
我的意思是

subtract2 x = x - 2

很容易解析,也很容易阅读,但是

subtract2 = (-2)

更容易读懂。
在你最初的例子中,无点形式(minus10)是相当可读的(但实际上我会质疑你给minus起的名字,这让我想到一个类似(-)的二进制函数,而它是三进制的)。

相关问题