TLDR:是否有一个Haskell库提供函数定义(最好使用简洁的符号或命名),用于处理多参数函数组合的常见模式,如APL中的模式?
完整问题:
我是Haskell的新手,最近我发现自己在问其他Haskell新用户问过的组合问题,比如如何用二进制函数组合一元函数,或者如何以特定的方式组合两个二进制函数。尽管函数组合模式的目标相当明确(并且可能相当常见),但这两种方法的无点解都相当不直观((.)(.)(.)
或LiftM2 (.)
)。
我花了一点时间学习APL语言,非常喜欢函数组合模型的简单和强大。例如,这里有一张图表,显示了许多组合模式,这些模式可以用极其简洁的符号来完成,在花一些时间学习该语言后,这些符号实际上相当可读。
这些APL模式中的任何一个都可以在Haskell中通过编写一个简单的lambda表达式来实现。例如,在我的一个Haskell文件中有以下行
(...) = (.)(.)(.)
或者(可能更清楚)可以写
(...) = f g x y = f (g x y)
或者有一个更清晰的名称
_1_atop_2 = f g x y = f (g x y)
这样我就可以在代码的主要部分轻松地用无点风格的二进制函数组成一元函数。例如,为了定义实数之间的距离函数,我只需要用减法组成绝对值:
dist = abs ... (-)
或
dist = _1_atop_2 abs (-)
(在这种情况下,dist x y = abs $ x - y
的更明确的风格可以说更清晰,但在更复杂的情况下,无点风格更好。)
我的问题是:有没有Haskell库提供这些组合模式的定义很明显,我可以用这些模式的琐碎lambda定义创建自己的模块,但我想知道是否有一些标准的表示法/命名约定可以实现这一点。
据我所知,没有一个Haskell库可以提供所有功能。虽然有些是内置的,但您必须从各种库中收集其余的。以下是Conor Hoekstra的组合逻辑和数组中的组合器中的表19(Haskell中的组合符)语言:
名称 | 库 | |
---|---|---|
I | id | 前奏曲|
K | const |
前奏曲 |
W | join |
控制。Monad |
C | flip |
前奏曲 |
B | (.) |
前奏曲 |
S | (<*>) /ap |
控制。适用性 |
B₁ | (.:) |
数据。组成 |
Ψ | on |
数据。函数 |
Φ | liftA2 |
控制。适用性 |
A | ($) |
前奏曲 |