【发布时间】: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
我正在尝试编写一个简单的 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
要解决眼前的问题,您需要在函数中使用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 > b 为假,OCaml 应该返回什么?它不假设任何内容,但返回 () 与您的函数的假定类型(整数)冲突。
当然,在你的函数中a > b 为假是不可能的,因为如果不是a = b 而不是a < b,则唯一的其他选择是a > b。因此,您不需要在函数末尾添加另一个 if 语句;到那时,你肯定知道a > b,所以你可以简单地说else 2。
【讨论】: