2017-01-28 17 views
0

Может ли кто-то помочь. Я не получаю последовательность оценки здесь и как мы получили значения «ans». например в первом примере нет значения y, и я не уверен, возвращает ли это пару или вызывает x! (fn y => y x). Было бы очень полезно, если вы можете отслеживать каждое выражение.Значения привязки в SML?

val x = 1 
val f = (fn y => y x) 
val x = 7 
val g = (fn y => x - y) 
val ans = f g 

val ans = 6 : int 

===================================== 
fun f p = 
let 
val x = 3 
val y = 4 
val (z,w) = p 
in 
(z (w y)) + x 
end 
val x = 1 
val y = 2 
val ans = f((fn z => x + z), (fn x => x + x + 0)) 

val ans = 12 : int 
+0

Вы задавали один и тот же вопрос дважды? –

ответ

1

Есть несколько вещей, которые помогают сделать проблемы, как это гораздо яснее , пытаясь понять Иностранец функции Lexical scoping работы.

  1. добавить типов к параметрам и возвращаемые значения без внесения изменений в программу, компилятор сообщит вам, если вы сделаете это неправильно ...
  2. заменить анонимные функции с именованными из них.
  3. переименовать переменные, имеющие одинаковые имена, но относящиеся к различным лексическим областям.
  4. удалить привязки переменных, которые будут использоваться только один раз.

связывание значения имя фактически не выполняют какие-либо вычислений, так просто для удобства читателя, если он не делает эту работу это служит лишь запутать, а затем все средства удалить его ,

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 
+0

Отличный ответ! Спасибо :) –