bigint
作为表格的数据类型(符号,基数,整数列表),如7的基数为35
(Pos,7,[0; 5])。
现在我们需要将这个bigint转换为整数,如果我们放(Pos, 7, [0;5])
然后我们得到答案为35.我不明白如何在没有的情况下引发异常。在列表中大于基数或基数为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)))
;;
我之前收到的语法错误(匹配l1 ... 请告诉我们错了。
答案 0 :(得分: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)))
;;
答案 1 :(得分:3)
关键字exception
用于定义例外。
例如,exception Invalid_input
首先定义例外,然后稍后定义,raise Invalid_input
。
请注意,为方便起见,您可以使用failwith "Invalid_input"
使用给定字符串引发内置异常Failure
。