Вопрос

Как принять функцию в качестве аргумента?

Основная идея - что -то вроде этого (что не работает):

∇R ← double a
R ← 2 × a
∇

∇R ← a applytwice f
R ← f f a
∇

5 applytwice double

Есть что -то вроде \fun в Erlang или функциональные указатели в C?

Это было полезно?

Решение

В APL функции не могут быть переданы в качестве аргументов для функций. Тем не менее, APL имеет операторы, которые являются функциями более высокого порядка, которые могут принимать функции в качестве аргументов. Существуют примитивные операторы, такие как / (сокращение), например, для суммы вектора + / V. Функция + - левый операнд и передается в оператор /.

В Dyalog APL есть примитивный оператор, использующий (именованную «питание») для применения функции n раз, чтобы мы могли написать:

      double←{2×⍵}
      (double ⍣ 2) 7
28
      (double ⍣ 10) 7
7168

Вы также можете написать своих собственных операторов (в большинстве APL). В Dyalog APL мы можем написать ваш оператор ApplyTwice как:

     applytwice←{⍺⍺ ⍺⍺ ⍵}
     double applytwice 7
28

Наконец, вы можете выполнять функции, поместив их в пространство имен и пропустив пространство имен. Это похоже на очень легкий экземпляр класса с методом. Например:

       s←⎕NS ''
       s.f←{2×⍵}
       ApplyFTwice←{⍺.f ⍺.f ⍵}
       s ApplyFTwice 7
28

В этом случае функция должна быть названа F, но мы могли бы много разных функций с именем F, каждая в своем собственном пространстве имен.

Другие советы

Ваше применение было не так далеко не правильным. В Dyalog APL и, возможно, другие код не DFN (определение функции устаревшего) будет выглядеть примерно так:

       ∇ R ← (f applytwice) a
  [1]   R ← f f a
       ∇

       - applytwice 42
  42

       {2×⍵} applytwice 42
  168

В APL любая «программа», которая принимает ноль, один или два аргумента данных, является «функцией». Встроенные функции, такие как + - и т. Д., Можно назвать «примитивными функциями». Двойная функция в примерах была бы «определенной функцией». «Оператор» принимает функции и данные в качестве аргументов. + / и + - примеры оператора восстановления и сканирования, + - левый аргумент функции для оператора / или . В отличие от этого, функции сжатия и расширения используют одни и те же символы (/ и ), но имеют аргумент левых данных.

Такова номенклатура APL.

Вы также можете обойти это цитата. Анкет Вы можете передать массив Char, а затем выполнить его в функции. Эта строка может содержать имя определенной функции или прямое определение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top