Functional programming SML中的值绑定?

Functional programming SML中的值绑定?,functional-programming,sml,ml,Functional Programming,Sml,Ml,有人能帮忙吗。我不知道评估的顺序,也不知道我们是如何得到“ans”的值的。e、 在第一个例子中没有y的值,我不确定这是返回一对还是调用x!(fn y=>y x)。如果您可以跟踪每个表达式,这将非常有用 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

有人能帮忙吗。我不知道评估的顺序,也不知道我们是如何得到“ans”的值的。e、 在第一个例子中没有y的值,我不确定这是返回一对还是调用x!(fn y=>y x)。如果您可以跟踪每个表达式,这将非常有用

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

有几件事可以让这样的问题变得更清楚 当试图理解一个外来函数的工作原理时

  • 在不修改程序的情况下,将类型添加到参数并返回值,编译器将告诉您是否出错
  • 用命名函数替换匿名函数
  • 重命名具有相同名称但引用不同词法范围的变量绑定
  • 删除只使用一次的变量绑定
  • 将值绑定到名称实际上不会执行任何计算, 因此,这仅仅是为了读者的利益,如果它没有这样做的话 它只是用来混淆,然后千方百计将其删除

    fun f (y1 : int -> 'a) = y1 1 : 'a;
    fun g (y2 : int) = 7 - y2 : int;
    val ans : int = f g;
    
    所以g作为f的一个参数,f调用g,给它一个值为1的参数x,使y2=1,g减去7-1返回6。 g的返回值是一个int,因此当g应用于f的a类型时,它是一个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);
    
    最后,我们可以去掉只使用一次的let值 并将(z,w)=p替换为(z,w)作为函数的参数,这应该更容易理解

    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
    

    同一个问题你问了两次吗?回答得很好!非常感谢:)