【问题标题】:Ocaml unboud valueOcaml 未绑定值
【发布时间】:2014-11-08 11:19:22
【问题描述】:

我正在尝试编写一个简单的 Ocaml 函数,但出现此错误:

错误:这个表达式有单位类型 但是需要一个 int 类型的表达式

let rec euclid a b = 
  if a = b then a
  else if a < b then 1
  else if a > b then 2

【问题讨论】:

    标签: ocaml


    【解决方案1】:

    要解决眼前的问题,您需要在函数中使用else 子句:

    let rec euclid a b =
      if a = b then a
      else if a < b then 1
      else 2 (* You know a > b is the only possible alternative *)
    

    你可能意识到这一点,但这个函数不是递归的,我认为它也不是在做你想做的事。

    但是,您在概念化函数在 Ocaml 中的工作方式时存在错误。您编写函数的方式本质上是必不可少的;它是一系列按顺序执行的if/then 语句。相反,euclid 的返回值应该只是一个广泛的if/then 语句的结果(一个整数值)。正如我在上面所做的那样,嵌套是可以接受的,但最重要的是,函数只是一个被求值的表达式,而不是一系列命令式操作。

    编辑更新问题:

    所有 OCaml if/then 语句都应该有 else 子句。您最后一个嵌套的 if/then 语句没有 else 子句。如果 OCaml 检测到没有 else 子句的 if/then 语句,则假定 else 子句返回 ()(单位)。本质上,如果a &gt; b 为假,OCaml 应该返回什么?它不假设任何内容,但返回 () 与您的函数的假定类型(整数)冲突。

    当然,在你的函数中a &gt; b 为假是不可能的,因为如果不是a = b 而不是a &lt; b,则唯一的其他选择是a &gt; b。因此,您不需要在函数末尾添加另一个 if 语句;到那时,你肯定知道a &gt; b,所以你可以简单地说else 2

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多