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 ...请告诉我出了什么问题。
语法是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)