j_v*_*w_d 3 haskell apl function-composition
TLDR:是否有一个 Haskell 库提供函数定义(最好具有简洁的符号或命名)来处理多参数函数组合的常见模式,例如 APL 中的模式?
完整问题:
我是 Haskell 的新手,最近我发现自己在问其他 Haskell 新用户提出的组合问题类型,例如如何用二元函数组合一元函数或如何以特定方式组合两个二元函数。尽管函数组合模式的目标相当明确(并且可能相当常见),但这两个问题的无点解决方案都(.)(.)(.)
相当LiftM2 (.)
不直观(要么 要么 )。
我花了一点时间使用 APL 语言,并且非常喜欢它的简单而强大的函数组合模型。例如,下面是许多组合模式的图表,可以用极其简洁的符号来完成,在人们花一些时间学习该语言后,这些符号实际上是相当可读的。
任何这些 APL 模式都可以在 Haskell 中通过编写简单的 lambda 表达式来完成。例如,我的 Haskell 文件之一中有以下行
(...) = (.)(.)(.)
Run Code Online (Sandbox Code Playgroud)
或者(可能更清楚)可以写成
(...) = \f g x y = f (g x y)
Run Code Online (Sandbox Code Playgroud)
或者使用更清晰的名称
_1_atop_2 = \f g x y = f (g x y)
Run Code Online (Sandbox Code Playgroud)
这样我就可以在代码的主要部分中以无点风格轻松地组合一元函数和二元函数。例如,要定义实值之间的距离函数,我只需将绝对值与减法相结合:
dist = abs ... (-)
Run Code Online (Sandbox Code Playgroud)
或者
dist = _1_atop_2 abs (-)
Run Code Online (Sandbox Code Playgroud)
(在这种情况下,更明确的风格dist x y = abs $ x - y
可以说更清晰,但在更复杂的情况下,point free 更好。)
我的问题是:是否有任何 Haskell 库提供这些组合模式的定义?显然,我可以使用这些模式的简单 lambda 定义创建自己的模块,但我想知道是否有一些标准符号/命名约定来执行此操作。
据我所知,没有一个 Haskell 库可以提供所有这些功能。虽然有些是内置的,但您必须从各个库中收集其余的。这里的表 19(Haskell 中的组合器)来自 Conor Hoekstra 的组合逻辑和数组语言中的组合器:
\n姓名 | 图书馆 | |
---|---|---|
我 | id | 序幕 |
K | const | 序幕 |
瓦 | join | 控制单子 |
C | flip | 序幕 |
乙 | (.) | 序幕 |
S | (<*>) /ap | 控制.应用 |
B\xe2\x82\x81 | (.:) | 数据组成 |
\xce\xa8 | on | 数据.函数 |
\xce\xa6 | liftA2 | 控制.应用 |
A | ($) | 序幕 |