【问题标题】:Composition using foldr SML使用 foldr SML 组合
【发布时间】:2021-12-20 06:53:11
【问题描述】:

有没有办法从包含函数的变量中执行类似 a(b(c(5))) 的操作?

代码是这样的:

val a = fn x => x + 10
val b = fn x => x * x
val c = fn x => (x - 2) * 3
val fs = [a, b, c]

【问题讨论】:

    标签: sml fold


    【解决方案1】:

    您可以将op 应用于组合运算符o 以便它可以用作函数,然后将该函数与foldr 一起使用以将函数列表折叠成一个函数。使用恒等函数作为初始值。

    因此,foldr (op o) identity [a, b, c] 等价于a o (b o (c o identity)),其中identity 是恒等函数:

    fun identity x = x;
    

    使用已发布的 abcfs 的定义,将 OP 示例编写为单行代码也不错:

    - (foldr (op o) (fn x => x) fs) 5;
    val it = 91 : int
    - a(b(c 5));
    val it = 91 : int
    

    如果已经定义了identity,会更容易一些,但更好的是定义一个高阶函数来抽象它:

    fun composeList fs = foldr (op o) (fn x => x) fs;
    
    - composeList fs 5;
    val it = 91 : int
    

    【讨论】:

    • 如果我们通过省略多余的括号将fun composeList fs = (foldr (op o) (fn x => x) fs);重写为fun composeList fs = foldr (op o) (fn x => x) fs;,很明显这可以使用currying写成val composeList = foldr (op o) (fn x => x);
    • @Chris -- 最后一部分因为SML's value restriction 而无法工作。不过,我继续删除了 composeList 定义中的外括号。
    • 非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-06
    • 2016-02-02
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    相关资源
    最近更新 更多