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» в кавычки, потому что это немного более общее, чем в лямбда-исчислении, работая для любого числа значений настек, а не один.
Конечно, вы можете выделить частичное приложение в собственное определение, например комбинатор papply
в Cat, который уже определен как swons
(swap cons
) в Joy, но также может быть определено так:
DEFINE
papply (* x [F] -- [x F] *)
== [unit] dip concat ;
f (* xs n -- xs[>=n] *)
== [>] papply filter .
В котенке это можно записать несколькими различными способами в соответствии с предпочтением:
// Point-free
function \> compose filter
// Local variable and postfix
-> n; { n (>) } filter
// Local variable and operator section
-> n; \(n <) filter
Любая стратегия оценки, совместимая с функциональным программированиемтакже совместим с конкатенацией прогрamming— popr - ленивый конкатенационный язык.