Есть несколько вещей, которые помогают сделать проблемы, как это гораздо яснее , пытаясь понять Иностранец функции Lexical scoping работы.
- добавить типов к параметрам и возвращаемые значения без внесения изменений в программу, компилятор сообщит вам, если вы сделаете это неправильно ...
- заменить анонимные функции с именованными из них.
- переименовать переменные, имеющие одинаковые имена, но относящиеся к различным лексическим областям.
- удалить привязки переменных, которые будут использоваться только один раз.
связывание значения имя фактически не выполняют какие-либо вычислений, так просто для удобства читателя, если он не делает эту работу это служит лишь запутать, а затем все средства удалить его ,
fun f (y1 : int -> 'a) = y1 1 : 'a;
fun g (y2 : int) = 7 - y2 : int;
val ans : int = f g;
так г задаются в качестве параметра F, F вызывает г придавая ему параметр х, имеющим значение 1, делая y2 = 1, который вычитает г 7 - 1 возвращение 6. возвращаемого значения является г int, поэтому f '' тип, когда g применяется к нему, является int.
для второй один очистить его немного, я вытащил анонимные Fn-х из в их собственных и именованных значений и вызова f (Foo, Bar), чтобы сделать его более удобным для чтения ...
fun f p =
let val x = 3
val y = 4
val (z, w) = p
in (z (w y)) + x end
fun foo z = z + 1;
fun bar x = x * 2;
val ans = f(foo, bar);
Наконец , мы можем избавиться от значений ЛПЭ, которые используются только один раз и заменяющих (г, ш) = р только с (г, ш) в качестве параметра функции, которая должна быть намного легче следовать
fun f (z, w) = (z (w 4)) + 3
fun foo z = z + 1;
fun bar x = x * 2;
val ans = f(foo, bar);
val ans = ((4 * 2) + 1) + 3
Вы задавали один и тот же вопрос дважды? –