функция не имеют аргументы, он принимает аргументы. Вы даете аргументы функции, и вы возвращаете результат. Вы не можете спросить функцию, что ее аргументы, потому что у нее их еще нет. Вы должны дать аргументы функции.
Чтобы сделать это, возможно, немного яснее, давайте рассмотрим пример. Давайте возьмем следующие функции:
fun add x y = x + y
fun plus1 x = x + 1
fun applyTwice f x = f (f x)
applyTwice
Теперь принимает функцию и аргумент, и применяет функцию к аргументу дважды. Мы можем назвать это так:
applyTwice plus1 40
или как это:
applyTwice (add 1) 40
и в обоих случаях ответ будет 42 (потому что это значение plus1 (plus1 40)
и add 1 (add 1 40)
, add 1
на самом деле является точно такая же функция, как plus1
).
Теперь я не знаю, хотите ли вы быть в состоянии передать (plus1 40)
в качестве значения для f
, а затем каким-то образом получить 40
от того или вы хотите передать (add 1)
, а затем каким-то образом получить обратно 1
ли, но и невозможно ,
В случае (plus1 40)
вы даже не можете передать это как значение для f
. f
должен быть функцией, но (plus1 40)
является целым числом (41), а не функцией.
(add 1)
С другой стороны, это функция, и вы действительно можете передать ее как значение для f
. На самом деле я сделал это в своем примере. Но то, что вы не можете сделать, это получить от него значение 1
. Я имею в виду, представьте, что вы могли бы это сделать. Что должно произойти, если вы прошли plus1
вместо (add 1)
. Что вы должны получить от этого? Нет значения, зафиксированного в plus1
, поэтому на самом деле ничего не получится, но ясно, что plus1
является таким же аргументом в пользу applyTwice
, что и (add 1)
.
Единственный способ, который может иметь смысл, состоит в том, что частично примененная функция имела другой тип от обычных функций, позволяя вам определить функцию, которая принимает (add 1)
как один аргумент, но не plus1
. Однако это не тот случай ML, и на самом деле это не так много. Наличие различных типов функций просто усложнило бы систему типов и затруднило бы определение функций более высокого порядка (поскольку они должны были иметь дело с обоими типами функций). Я также не вижу случая использования, когда эта способность будет даже полезной.
Похоже, вы хотите сделать интроспекцию такого рода, которая возможна в Python (где вы можете * получить информацию о аргументах функции, когда вы передали эту функцию). Это невозможно в SML. Было бы сложно реализовать статическую типизацию. Что вы надеетесь сделать? –
Я думаю, вы поняли, что я пытаюсь сделать правильно, но я думаю, что это не работает в SML. Моя цель - найти способ выполнить функцию fn в моем примере кода в аргументе, который, по-видимому, я не могу получить напрямую. –
@JohnJenkins Просто уточнить: что может сделать Python, это рассказать вам, сколько аргументов выполняет функция и каковы их имена. Он не сообщает вам фактическое значение, которое вы должны передать функции. Эта ценность действительно подходит для вас на любом языке. – sepp2k