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)
aka unit
, 接受一个值并将其包装在引号中,而compose : (A -> B) (B -> C) -> (A -> C)
aka cat
, 连接两个引号。)
然后只需“eta”-reduce n
:
f = quote [ > ] compose filter
我将“eta”放在引号中,因为它比 lambda 演算更通用,适用于堆栈上的任意数量的值,而不仅仅是一个。
你当然可以将部分应用分解到它自己的定义中,例如papply
Cat 中的组合子,它在 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
任何与函数式编程兼容的评估策略也与级联编程兼容——<a href="https://github.com/HackerFoo/poprc" rel="nofollow noreferrer">popr 是一种惰性级联语言。