gpt4 book ai didi

recursion - F#如何实现let rec?

转载 作者:行者123 更新时间:2023-12-01 01:55:25 24 4
gpt4 key购买 nike

我想知道 F# 如何实现 let rec ,我找不到答案。作为前言,我将介绍 Scheme 如何实现 letrec :

  • 在方案中,let只是定义 lambda 并应用它的语法糖:
  • (let ((x 1)) (+ x 2))
    被转化为
    ((lambda (x) (+ x 2)) 1)
    (在每种情况下,表达式都被评估为 3 )。
  • letrec也是语法糖,但 #f作为初始参数传递给 lambda 的参数,并且 set!表达式在 letrec 之前注入(inject) body ,就像在这个转换中:
  • (letrec ((x 1)) (+ x 2)) => ((lambda (x) (begin (set! x 1) (+ x 2))) #f) .

    考虑到 F# 没有与 Scheme 的 set! 等效的运算符,如何实现 let rec ?是否将函数的参数声明为 mutable ,然后在函数体中对它们进行变异?

    最佳答案

    在 F# 中,let rec允许在绑定(bind)之前从函数内部引用绑定(bind)。 let rec本身没有实现,因为它只是一个编译器提示。

    在这个人为的例子中,

    let rec even =
    function 0 -> true | 1 -> false | x -> odd (x - 1)
    and odd =
    function 0 -> false | 1 -> true | x -> even (x - 1)

    编译后的 IL 非常简陋地转换为:
    public static bool even(int _arg1)
    {
    switch (_arg1)
    {
    case 0:
    return true;
    case 1:
    return false;
    default:
    return odd(_arg1 - 1);
    }
    }

    public static bool odd(int _arg2)
    {
    switch (_arg2)
    {
    case 0:
    return false;
    case 1:
    return true;
    default:
    return even(_arg2 - 1);
    }
    }

    所有函数定义都静态编译为 IL。
    F# 最终是一种在 CLR 上运行的语言。
    没有元编程。

    关于recursion - F#如何实现let rec?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41209152/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com