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 …
我希望有人能解释为什么测试 1-5 有效但测试 6 没有。我认为用 ' 引用 lambda 并在 lambda 前面使用 #' 都返回指向该函数的指针,唯一的区别是 #' 将首先编译它。
(defun test-1 (y)
(mapcar (lambda (x) (expt x 2))
'(1 2 3)))
(defun test-2 (y)
(mapcar (lambda (x) (expt x y))
'(1 2 3)))
(defun test-3 (y)
(mapcar #'(lambda (x) (expt x 2))
'(1 2 3)))
(defun test-4 (y)
(mapcar #'(lambda (x) (expt x y))
'(1 2 3)))
(defun test-5 (y)
(mapcar '(lambda (x) (expt x 2))
'(1 2 3)))
(defun test-6 (y)
(mapcar '(lambda …Run Code Online (Sandbox Code Playgroud)