GNU APL 中的柯里化

Currying in GNU APL

我试图在 GNU APL 中“套用”一个函数,但它似乎不起作用?

例如:

      (1∘+) 1
SYNTAX ERROR
      (1∘+)1
      ^   ^

我做错了什么? 是不是使用了错误的字形?

GNU APL 没有 Bind meaning of , found in Dyalog 和相关的实现。相反, 字形专门用于外积符号,∘.f.

不过,您可以自己定义一个合理的替代品:

∇ r←(a o b)z
  →3⌊⎕NC'b'
  r←z a b ⋄ →0
  r←a b z
∇

它几乎可以像原语一样使用,除了需要在其左侧与名称相邻时使用 space 或在其右侧使用 non-glyph:

      (1o+) 1
2
      (+o 1) 1
2
      1o+ 1
2

注意上面的替代品不提供功能composition。为了也包括这一点,我们必须寻求更复杂的定义:

∇ 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