OCaml将int转换为num

时间:2013-10-30 22:53:35

标签: numbers ocaml

我的num号码存在问题。 我想归因

   let one = num_of_int 1
   let zero = num_of_int 0

所以我打开num

   open Num

当我想实现它时出错。

# open Num
# let one = num_of_int 1
# let zero = num_of_int 0;;
File "", line 2, characters 21-22:
Error: This expression has type Num.num
   but an expression was expected of type int

如果可以的话请纠正,并给我一些链接,以便我在将来可以学习如何解决这类问题。

谢谢你的帮助。

最诚挚的问候。

3 个答案:

答案 0 :(得分:2)

您描述的行为不是官方的OCaml之一。所有最新版本的官方OCaml都接受您的问题代码。

$ ocaml nums.cma
        OCaml version 4.01.0

# open Num
  let one = num_of_int 1
  let zero = num_of_int 0;;
val one : num = Int 1
val zero : num = Int 0
# 

我猜您使用的是变体,可能是TryOCaml。我想它解析整数文字有一个很好的(但不幸的是令人困惑)。

答案 1 :(得分:1)

在最近的OCaml中,似乎如果打开Num模块,则1已被解释为Num。你不需要转换它。这对我来说似乎很神奇,但我在try.ocamlpro.com实践中观察到了它。

    Welcome to TryOCaml (v. 4.01.0)

# open Num;;
# 1;;
- : Num.num = Num 1

通常我不会打开Num模块。普及存在许多冲突。也许是当地人开放的:

let open Num in <expr>

答案 2 :(得分:0)

我理解这一点,但我需要将其更改为在程序的其余部分使用。要计算+ - 100位数的大数字,我只需要'num'

   open Num


   let one = num_of_int 1
   let zero = num_of_int 0

   let rec silnia n = 
   if n < 2 
   then one
   else (num_of_int n) */ silnia(n-1) 

   let rec newton n k =
   silnia n // (silnia k */ silnia (n-k))

   let bell = Array.make 101 zero;;
   bell.(0) <- one;; 
   bell.(1) <- one;;


   let i = ref 2
   let k = ref 0
   let x = ref zero
   let suma = ref zero

   let n = ref 100


 if !n != 0 || !n != 1 then
   while !i <= !n do   
        while !k <= (!i-1) do
          x := newton (!i-1) !k;
          suma := !suma +/ (!x */ bell.(!k));
          k := !k + 1 
        done;
      bell.(!k) <- (!suma);   
      suma:= zero;
      k:=0;
      i:= !i + 1;
   done;;