1

我有以下代码:

 - exception Negative of string;
> exn Negative = fn : string -> exn
 - local fun fact 0 =1
            | fact n = n* fact(n-1)
    in
            fun factorial n=
            if n >= 0 then fact n
            else
            raise Negative "Insert a positive number!!!"
            handle Negative msg => 0
    end;

它有什么问题?我得到错误:

! Toplevel input:
!       handle Negative msg => 0
!                              ^
! Type clash: expression of type
!   int
! cannot have type
!   exn

我该如何解决?如果用户输入负数,我希望函数通过异常返回 0。

我还想知道当用户输入负数时如何显示消息,因为 print() 返回单位,但函数的其余部分返回 int;

4

2 回答 2

4

raise和的优先级handle在 SML 中有点奇怪。你写的组是什么

raise ((Negative "...") handle Negative msg => 0)

因此,您需要在 周围添加括号if以获得正确的含义。

另一方面,我不明白为什么你提出一个异常只是为了立即捕获它。为什么不在else分支中简单地返回 0 呢?

编辑:如果要打印某些内容然后返回结果,请使用分号运算符:

(print "error"; 0)

但是,我强烈建议不要在阶乘函数中这样做。最好将 I/O 和错误处理与基本计算逻辑分开。

于 2013-08-04T20:12:27.870 回答
1

以下是修复代码的多种方法:

local
  fun fact 0 = 1
    | fact n = n * fact (n-1)
in
  (* By using the built-in exception Domain *)
  fun factorial n =
      if n < 0 then raise Domain else fact n

  (* Or by defining factorial for negative input *)
  fun factorial n =
      if n < 0 then -1 * fact (-n) else fact n

  (* Or by extending the type for "no result" *)
  fun factorial n =
      if n < 0 then NONE else SOME (fact n)
end
于 2013-08-04T20:23:23.713 回答