连接编程语言中的偏函数应用

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 是一种惰性连接式语言。