我现在正在学习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优雅”。
sczxawaw1#
您的minus10是一种非常惯用的方法;这通常被绑定在where子句中,这样它就不会扰乱顶级API。flip minus 10和(minus10)也是常见的选择。这两个选项只适用于填充 * 第二个 * 参数;更一般地说,为了填充第 n 个参数,RIDAS更好地泛化,如\x -> minus x 10。
minus10
where
flip minus 10
(
10)
\x -> minus x 10
n1bvdmb62#
从根本上说,您是在问如何编写minusy10而不显式地命名其参数。而且,很明显,你也不想通过将它们移动到lambda中来作弊:
minusy10
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起的名字,这让我想到一个类似(-)的二进制函数,而它是三进制的)。
minus
(-)
2条答案
按热度按时间sczxawaw1#
您的
minus10
是一种非常惯用的方法;这通常被绑定在where
子句中,这样它就不会扰乱顶级API。flip minus 10
和(
minus10)
也是常见的选择。这两个选项只适用于填充 * 第二个 * 参数;更一般地说,为了填充第 n 个参数,RIDAS更好地泛化,如\x -> minus x 10
。n1bvdmb62#
从根本上说,您是在问如何编写
minusy10
而不显式地命名其参数。而且,很明显,你也不想通过将它们移动到lambda中来作弊:你想做的是以“无点风格”编写
minusy10
。在这种情况下,这很容易做到,就像在另一个答案中所建议的那样,但是在更一般的情况下,你可能想引用pointfree.io,它会给你给予一种可能的方法(但是可能存在更多)来编写无点风格的函数。
在这个特定的情况下,它得出了解决方案
flip minus 10
(这可能不是最可读的一个;我会叫(
minus10)
更可读,而不是)。另一方面,关于你的感觉,
如果我必须定义一个新函数来实现这一点,我觉得它失去了一些“Haskell优雅”
值得注意的是,如果过度使用,无点样式可能会降低可读性。事实上,即使是非常简单的函数,你可以在眨眼之间阅读和理解,比如这个,
point-free风格可能会导致与可读性相反的东西(实际上甚至更长!):
所以我想说,在无积分风格和“全积分”(?)风格。这种平衡在哪里?在我看来,应该以最大的 * 可读性 * 为目标,这与“解析性”不同。
我的意思是
很容易解析,也很容易阅读,但是
更容易读懂。
在你最初的例子中,无点形式
(
minus10)
是相当可读的(但实际上我会质疑你给minus
起的名字,这让我想到一个类似(-)
的二进制函数,而它是三进制的)。