0

我是 Haskell 的新手,不知道哪个是惯用的 - 使用前缀形式或中缀形式的运算符。到目前为止,我注意到,名称中带有特殊字符的函数(例如<$><*>>>=)以中缀形式使用,但名称由字母组成的函数以前缀形式使用。我的猜测是这是受到数学的启发,尽管我不确定。

我查找了Blow your mindCategory:Idioms并且还搜索了stackoverflow,但无济于事。

编辑

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

4

1 回答 1

5

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

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

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

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

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

于 2020-01-01T22:41:14.083 回答