前缀或中缀:哪个是 Haskell 的惯用语?

brj*_*brj 0 haskell infix-operator prefix-operator

我是 Haskell 的新手,不知道哪个是惯用的 - 使用前缀形式或中缀形式的运算符。从我目前为止发现,有特殊字符功能名称,如<$><*>>>=等在中缀形式,但功能,其名称由字母最多的前缀形式使用使用。我的猜测是这是从数学中获得的灵感,尽管我不确定。

我查过Blow your mind , Category:Idioms并搜索了 stackoverflow ,但无济于事。

编辑

澄清一下,什么时候中缀函数和前缀运算符是惯用的?

Jos*_*ica 5

您可以以任何方式调用任何函数。

  • 正则函数,前缀,没什么特别的: fmap foo bar
  • 正则函数,中缀,通过添加反引号: foo `fmap` bar
  • 运算符,前缀,加括号: (<$>) foo bar
  • 运算符,中缀,没什么特别的: foo <$> bar

至于调用它们时的惯用语是什么,这是一个有点软的问题,但这里有一些指导原则:

  • 如果您有两个在其他方面完全相同的函数,但一个是运算符而另一个不是(主要示例是fmap<$>),则使用可以让您使用更少括号的任何一个。
  • 如果您的函数只有一种形式,那么更喜欢不需要任何特殊用法的方法(因此常规函数的前缀和运算符的中缀)。
  • 不是翻转单个函数来首先提供第二个参数,而是经常使用中缀运算符部分。例如,(`foo` bar)比 更常见flip foo bar
  • 有一些常见的例外,其中常规函数几乎总是使用中缀。例如,needle `elem` haystack比 更常见elem needle haystack。其他常见的包括divmod。但是,我不知道任何相反的情况,其中运算符通常用作前缀。

至于你是否应该让你的新函数成为运算符,答案几乎总是不。命名函数通常更容易理解。在这种情况下的例外是,如果它是您在单个表达式中链接很多的东西(如 Servant 的:<|>:>),以及在问题域中常见和众所周知的运算符。