如何在ocaml代码中引发异常?

har*_*rez 2 ocaml

bigint因为像7的35之类的形式(符号,基数,整数列表)的数据类型是(Pos,7,[0; 5])。现在我们需要将这个bigint转换为整数,如果我们把它设为整数,则(Pos, 7, [0;5])得到的答案为35。我不明白如何在没有的情况下引发异常。列表中大于base或base为0或最高有效数字为零-> [7; 3; 4; 0]。因此我写道:

#type sign = Pos | Neg;;
#type digitseq = int list;;
#type bigint = sign * int * digitseq;;
#let check_bigint (sign, r, l1) = match l1 with
    [] -> true
  | [0] -> false
  | x::xs -> if (x >= r) then false else check_bigint (sign, r, xs)
;;
#let rec bigint2int (sign, r, l1) =
  if (check_bigint (sign, r, l1) = false) then
    raise exception Invalid_input
  else
    (match l1 with
       [] -> 0
     | x::xs -> if (sign = Pos) then
                  x+r*(bigint2int (sign, r, xs))
                else (-x)+r*(bigint2int (sign, r, xs)))
;;
Run Code Online (Sandbox Code Playgroud)

我在其他地方之前遇到语法错误(匹配l1 ...请告诉我出了什么问题。

Pas*_*uoq 5

语法是raise Invalid_input不是raise exception Invalid_input

请注意,这#不是程序的一部分,因此您不应将其包括在发布的OCaml代码段中。您还有另一个问题,因为您忘记了rec的定义check_bigint。这是使用顶级的另一个陷阱。您最好立即开始使用编译器。

type sign = Pos | Neg;;
type digitseq = int list;;
type bigint = sign * int * digitseq;;
exception Invalid_input;;
let rec check_bigint (sign, r, l1) = match l1 with
    [] -> true
  | [0] -> false
  | x::xs -> if (x >= r) then false else check_bigint (sign, r, xs)
;;
let rec bigint2int (sign, r, l1) =
  if (check_bigint (sign, r, l1) = false) then
    raise Invalid_input
  else
    (match l1 with
       [] -> 0
     | x::xs -> if (sign = Pos) then
                  x+r*(bigint2int (sign, r, xs))
                else (-x)+r*(bigint2int (sign, r, xs)))
;;
Run Code Online (Sandbox Code Playgroud)