连接编程语言中的偏函数应用
Partial Function Application in Concatenative Programming Languages
假设我有一个 haskell 函数 f n l = filter (n<) l
,它接受一个整数 n
并列出 l
和 returns [=] 中的所有整数12=] 大于 n
.
我正在尝试弄清楚如何用像 Joy 这样的语言最好地编写这个函数。我通常很幸运将 haskell 函数转换为无点形式 f = filter . (<)
,然后尝试从那里在 Joy 中重写它。但是我想不出如何在连接语言中模拟部分函数应用程序。
到目前为止,我已经尝试过类似 swap [[>] dip] filter
的操作,但似乎必须有一种 better/cleaner 的方式来编写它。
此外,我正在尝试编写自己的连接语言,想知道惰性求值是否可以与连接语言兼容。
swap [[>] dip] filter
将不起作用,因为它假设每次调用过滤所依据的报价时都可以访问 n
;这意味着 filter
在运行时不能在堆栈上留下任何中间值,并且 >
不会消耗 n
。您需要在该引用中捕获 n
的值。
第一个“eta”-减少列表参数:
l n f = l [ n > ] filter
n f = [ n > ] filter
然后通过显式引用并与 >
:
组合来捕获 n
n f = n quote [ > ] compose filter
(假设 quote : a -> (-> a)
a.k.a. unit
获取一个值并将其用引号括起来,然后 compose : (A -> B) (B -> C) -> (A -> C)
a.k.a. cat
, 连接两个引号。)
然后只是“eta”-reduce n
:
f = quote [ > ] compose filter
我将“eta”用引号括起来,因为它比 lambda 演算更通用一些,适用于堆栈中的任意数量的值,而不仅仅是一个。
您当然可以将部分应用分解为自己的定义,例如Cat 中的 papply
组合子,在 Joy 中已经定义为 swons
(swap cons
),但也可以这样定义:
DEFINE
papply (* x [F] -- [x F] *)
== [unit] dip concat ;
f (* xs n -- xs[>=n] *)
== [>] papply filter .
在 Kitten 中,这可以根据偏好以几种不同的方式编写:
// Point-free
function \> compose filter
// Local variable and postfix
-> n; { n (>) } filter
// Local variable and operator section
-> n; \(n <) filter
任何与函数式编程兼容的求值策略也与连接式编程兼容——popr 是一种惰性连接式语言。
假设我有一个 haskell 函数 f n l = filter (n<) l
,它接受一个整数 n
并列出 l
和 returns [=] 中的所有整数12=] 大于 n
.
我正在尝试弄清楚如何用像 Joy 这样的语言最好地编写这个函数。我通常很幸运将 haskell 函数转换为无点形式 f = filter . (<)
,然后尝试从那里在 Joy 中重写它。但是我想不出如何在连接语言中模拟部分函数应用程序。
到目前为止,我已经尝试过类似 swap [[>] dip] filter
的操作,但似乎必须有一种 better/cleaner 的方式来编写它。
此外,我正在尝试编写自己的连接语言,想知道惰性求值是否可以与连接语言兼容。
swap [[>] dip] filter
将不起作用,因为它假设每次调用过滤所依据的报价时都可以访问 n
;这意味着 filter
在运行时不能在堆栈上留下任何中间值,并且 >
不会消耗 n
。您需要在该引用中捕获 n
的值。
第一个“eta”-减少列表参数:
l n f = l [ n > ] filter
n f = [ n > ] filter
然后通过显式引用并与 >
:
n
n f = n quote [ > ] compose filter
(假设 quote : a -> (-> a)
a.k.a. unit
获取一个值并将其用引号括起来,然后 compose : (A -> B) (B -> C) -> (A -> C)
a.k.a. cat
, 连接两个引号。)
然后只是“eta”-reduce n
:
f = quote [ > ] compose filter
我将“eta”用引号括起来,因为它比 lambda 演算更通用一些,适用于堆栈中的任意数量的值,而不仅仅是一个。
您当然可以将部分应用分解为自己的定义,例如Cat 中的 papply
组合子,在 Joy 中已经定义为 swons
(swap cons
),但也可以这样定义:
DEFINE
papply (* x [F] -- [x F] *)
== [unit] dip concat ;
f (* xs n -- xs[>=n] *)
== [>] papply filter .
在 Kitten 中,这可以根据偏好以几种不同的方式编写:
// Point-free
function \> compose filter
// Local variable and postfix
-> n; { n (>) } filter
// Local variable and operator section
-> n; \(n <) filter
任何与函数式编程兼容的求值策略也与连接式编程兼容——popr 是一种惰性连接式语言。