【问题标题】:ML currying and anonymous functionsML 柯里化和匿名函数
【发布时间】:2015-08-25 02:32:42
【问题描述】:

有人可以向我解释这三个绑定中发生了什么吗? 括号的意义是什么? g 的含义是什么,为什么它必须是 g 作为匿名函数中的参数?总的来说,这一切实际上发生了什么......谢谢!

val a = fn g => (fn x => fn y => x) (g 0) (g 7);
val b = fn g => (fn x => fn y => x) (g 0) (g "happy");
val c = fn g => (fn x => fn y => x) (g 0) (g (g 7));

【问题讨论】:

    标签: sml currying


    【解决方案1】:

    函数(fn x => fn y => x)constant function。它接受两个参数(xy)并始终返回第一个参数(即x)。

    此函数应用于abc 三个函数中的两个参数:

    1. a 中,常量函数应用于(g 0)(g 7)
    2. b 中,常量函数应用于(g 0)(g "happy")
    3. c 中,常量函数应用于(g 0)(g (g 7))

    在所有三种情况下,结果都是(g 0),因为第二个参数被丢弃了。因此,这三个函数都可以简化为:

    val a = fn g => g 0
    val b = fn g => g 0
    val c = fn g => g 0
    

    实际上,第二个函数(即b)会引发类型错误,因为g 首先应用于int,然后应用于string

    虽然ac 函数的结果相同,但它们的类型不同:

    1. a 的类型是(int -> 'a) -> 'a,因为我们不知道函数g 的返回类型。因此,它是一个多态函数,比c 更通用。
    2. c 的类型是(int -> int) -> int,因为g 应用于它自己的结果(即g 应用于(g 7))。因此,它的返回类型必须与其参数类型相同(即int)。

    因此,ac 更通用,c 的每个实例都可以安全地替换为 a,但反之则不然。

    【讨论】:

      猜你喜欢
      • 2012-10-06
      • 1970-01-01
      • 2013-11-16
      • 2017-06-30
      • 2015-10-28
      • 2016-01-01
      • 2021-02-07
      • 1970-01-01
      • 2014-12-27
      相关资源
      最近更新 更多