Haskell 中预定义的中缀运算符列表?

Fun*_*tor 5 haskell

基本上,我需要为函数组合定义中缀运算符,翻转g . f方式。

(#) :: (a -> b) -> (b -> c) -> a -> c
(#) = flip (.)

infixl 9 #
Run Code Online (Sandbox Code Playgroud)

在这里,我暂时选择了符号:#,但我不确定这个选择在与其他定义的冲突方面不会有问题。

奇怪的是我在 Haskell 中找不到预定义的中缀运算符列表。

我希望组合运算符尽可能简洁,希望是像 这样的单个字符.,如果可能的话,我想让它成为&。可以吗?

有任何指导或最佳实践教程吗?请指教。

相关问答:

Haskell 运算符允许使用哪些字符?

Sil*_*olo 11

您看不到 Haskell 内置运算符的列表,其原因与您看不到所有内置函数的列表的原因相同。他们无处不在。有些在Prelude,有些在Control.Monad,等等。 运算符在 Haskell 中并不特殊;它们是具有简洁语法的普通函数。总体来说,Haskeller 对操作员非常满意。只要花时间在您最喜欢的镜头库中,您就会发现很多看起来很有趣的操作员

就 而言(#),最好避免。我不知道有任何内置运算符调用它,但在解析时#可能有点特殊。具体来说,编译器扩展#在普通标识符的末尾启用,并且 GHC 遵循这种做法定义了许多内置(原始)类型。例如,Int是通常的(盒装)整数类型,而Int#是原始整数。大多数人不需要直接与它交互,但它是#Haskell 中的一种用法,如果添加操作符,可能会有点困惑。

您的(#)运算符在 Haskell 中调用(>>>),它适用于所有Category实例,包括函数。它的同伴是,对所有实例(<<<)的泛化。如果三个字符对你来说太长,我见过它在其他一些语言中被调用,但 Haskell 已经将该运算符用于其他用途。如果您不使用,则可以使用该运算符。但就我个人而言,我会选择. 任何 Haskeller 都会很快认出它。(.)Category(|>)Data.Sequence(>>>)

  • 就我个人而言,我认为“反向构图”不值得一个有价值的单字母符号,因为常规构图已经有了一个字母符号。如果您正在编写高尔夫代码,请使用“(#)”,因为它只是为了运动。如果您正在编写大型代码,那么只需使用“(&gt;&gt;&gt;)”,因为额外的两个字符不会产生太大的差异。 (3认同)
  • [`(&amp;)`](https://hackage.haskell.org/package/base-4.16.0.0/docs/Data-Function.html#v:-38-) 已经是 `flip ($)`。 (2认同)