Каррирование в GNU APL
Я пытался "каррировать" функцию в GNU APL, но, похоже, это не работает?
Например:
(1∘+) 1
SYNTAX ERROR
(1∘+)1
^ ^
Что я делаю неправильно? Не ∘ тот глиф использовать?
1 ответ
Решение
GNU APL не имеет значения
привязки∘
, найденный в Dyalog и связанных реализациях. Вместо этого
∘
глиф используется исключительно для обозначения внешнего продукта,
∘.f
.
Однако вы можете сами определить разумную замену:
∇ r←(a o b)z
→3⌊⎕NC'b'
r←z a b ⋄ →0
r←a b z
∇
Его можно использовать почти как примитив, за исключением того, что требуется пробел рядом с именем слева или не-глиф справа:
(1o+) 1
2
(+o 1) 1
2
1o+ 1
2
Обратите внимание, что указанная выше замена не обеспечивает композицию функций. Чтобы также включить это, мы должны пойти на более сложное определение:
∇ r←x(a o b)y ⍝ ∘
→2⌈¯5+2⊥3⌊⎕NC⍪'ab'
r←a b y ⋄ →0 ⍝ A∘f
r←y a b ⋄ →0 ⍝ f∘B
⍎'x←{⍵}'/⍨0=⎕NC'x'
r←x a b y ⍝ f∘g
∇
Теперь все работает:
(1o+) 1
2
(+o 1) 1
2
1o+ 1
2
1+o|¯1
2