【问题标题】:Make a function return itself after doing some work做一些工作后让函数返回自身
【发布时间】:2022-10-25 01:37:07
【问题描述】:
let log x = print_int x; log ;;

log 111 222;;

我期待log 打印111 并返回自身,然后在第二次调用时打印222,但它没有按预期工作,而是收到一条错误消息。为什么?如何使其按预期工作?

我也试过rec 无济于事。

File "./hello.ml", line 3, characters 8-11:
3 | log 111 222;;
            ^^^
Error: This expression has type int but an expression was expected of type
         float

【问题讨论】:

    标签: ocaml


    【解决方案1】:

    如果你试试这个:

    let log x = print_int x; log
    

    您正在返回已存在的 log,其类型为 float -> float,因此类型不匹配。

    如果你试试:

    let rec log x = print_int x; log
    

    类型系统变得混乱。你的log 正在接受int 并返回...一个接受int 并返回一个接受int 并返回的函数的函数

    这种递归不起作用。

    ...除非您启用递归类型。

    % ocaml -rectypes
    OCaml version 4.14.0
    Enter #help;; for help.
    
    # let rec log x = print_int x; log;;
    val log : int -> 'a as 'a = <fun>
    # log 222 111;;
    222111- : int -> 'a as 'a = <fun>
    

    【讨论】:

      【解决方案2】:

      除非您将log 声明为递归的,否则它的返回值将是其他函数,即log 的先前定义。而且,确实,log 是一个接受浮点值并返回浮点值的函数。

      如果您确实将log 声明为递归,您将遇到更多问题。特别是,您的函数将具有递归类型。您可以使用-rectypes 标志使其工作。

      (我会更全面地解释,但@Chris 在我写这篇文章时给出了很好的解释。)

      【讨论】:

        猜你喜欢
        • 2013-07-06
        • 2018-05-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-12-30
        • 1970-01-01
        • 1970-01-01
        • 2013-01-26
        相关资源
        最近更新 更多