【问题标题】:why function call returns error?为什么函数调用返回错误?
【发布时间】:2011-10-28 04:59:20
【问题描述】:

我在 F# 交互中尝试以下代码并得到“错误 FS0001:类型“int -> int”与类型“int”不匹配。这是我正在尝试的代码

> let rec factorial n = function
    | 0 -> 1
    | n -> n * factorial (n - 1);;

这是“科学家的 F3”书籍示例的关闭。 谢谢,

【问题讨论】:

    标签: f#


    【解决方案1】:

    只是添加一些有关语法的细节 - function 关键字创建一个函数,该函数接受一个参数(隐含地,没有命名它),然后允许您对该值进行模式匹配。

    有很多等效的方法可以做到这一点 - 使用 function 就像 ildjarn 描述的那样:

    let rec factorial = function
      | 0 -> 1
      | n -> n * factorial (n - 1)
    

    您也可以将factorial 声明为采用n 的函数,然后使用match

    let rec factorial n = 
      match n with
      | 0 -> 1
      | n -> n * factorial (n - 1)
    

    为了完整起见,您还可以使用fun 创建一个函数(这是function 的一个更简单的版本,它不允许您编写多个模式匹配案例):

    let rec factorial = fun n ->
      match n with
      | 0 -> 1
      | n -> n * factorial (n - 1)
    

    前两个选项都是惯用的 F# 代码 - 第二个稍微复杂一些(没有任何充分理由),所以我更喜欢前两个中的一个。

    【讨论】:

      【解决方案2】:

      正如您定义的那样,factorial 接受两个参数,但您只传递一个参数。因此,函数的第二个分支试图将 intint -> int 类型的部分应用函数相乘。

      第一行应该是

      let rec factorial = function
      

      (没有n)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-06-25
        • 2021-01-18
        • 2015-03-23
        • 2016-09-12
        • 1970-01-01
        • 1970-01-01
        • 2021-02-23
        • 1970-01-01
        相关资源
        最近更新 更多