Применение частичной функции в языках конкатенативного программирования - PullRequest
2 голосов
/ 03 мая 2019

Скажем, у меня есть функция haskell f n l = filter (n<) l, где она принимает целое число n и список l и возвращает все целые числа в l больше n.

Я пытаюсь выяснить, как лучше написать эту функцию на таком языке, как Joy. В общем, мне повезло с преобразованием функции haskell в бессмысленную форму f = filter . (<) и попыткой переписать ее в Joy оттуда. Но я не могу понять, как смоделировать частичное применение функции на конкатенативном языке.

Пока что я пытался сделать что-то вроде swap [[>] dip] filter, но похоже, что должен быть лучший / более чистый способ написать это.

Кроме того, я экспериментирую с написанием своего собственного конкатенативного языка и мне было интересно, может ли ленивая оценка быть совместимой с конкатенативными языками.

1 Ответ

3 голосов
/ 03 мая 2019

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 - ленивый конкатенационный язык.

...