Ocaml 为什么Num中的有理数打印为<;文章摘要>;?

Ocaml 为什么Num中的有理数打印为<;文章摘要>;?,ocaml,arbitrary-precision,opam,rational-number,Ocaml,Arbitrary Precision,Opam,Rational Number,我继续探索Ocaml的Num库,因为有一个关于逻辑的完整库是使用它编写的 今天,我想做一个有理数的负数。从1/2获取-1/2 为此,我认为,给定类型为Ratio.Ratio的a,我可以这样计算它的负数(并返回Ratio,而不是num): num之比(减去num(num之比a)) (职能来自:) 现在,我想检查结果,但我总是得到这个解决方案:Ratio.Ratio= 关键是,现在我意识到,当我使用ratio\u of_num时,我总是得到这个解决方案。例如: ratio_of_num (Int 2

我继续探索Ocaml的
Num
库,因为有一个关于逻辑的完整库是使用它编写的

今天,我想做一个有理数的负数。从
1/2
获取
-1/2

为此,我认为,给定类型为
Ratio.Ratio
a
,我可以这样计算它的负数(并返回
Ratio
,而不是
num
):

num之比(减去num(num之比a))

(职能来自:)

现在,我想检查结果,但我总是得到这个解决方案:
Ratio.Ratio=

关键是,现在我意识到,当我使用
ratio\u of_num
时,我总是得到这个解决方案。例如:

ratio_of_num (Int 2);;
- : Ratio.ratio = <abstr>
因此,我进行了
opam安装gmp
,我得到:

┌─ The following actions failed
│ λ build gmp 6.2.1
└─ 
╶─ No changes have been performed
这让我不知道如何继续尝试。这方面有什么帮助吗

无论是第一个问题还是第二个问题,我都将非常感谢您的回答

下面,根据下面的对话,我发布了一些添加到问题中的版本:

编辑(添加所需的#require)

我已经按照@ivg的建议做了,但仍然不起作用(我做了开头的
opennum
,因为它会提出其他要求):

编辑3(在Ocaml中工作,而不是utop)

##需要“num”;;
#设pp_num ppf x=Format.fprintf ppf“%s”(num.string_of_num x);;
val pp_num:Format.formatter->num.num->unit=
##安装打印机pp#u num;;
#数量之比(整数2);;
-:比率。比率=
# 
编辑4(适用于utop,请注意,当结果为整数时,打印可简化结果)

utop#让pp_比率ppf r=Format.fprintf ppf“%a”pp_num(num_of_比率r);;
val pp_比率:Format.formatter->ratio.ratio->unit=
─( 23:28:07 )─< 命令6>──────────────────────────────────────{计数器:0}─
utop##安装#打印机pp#比率;;
─( 23:28:22 )─< 命令7>──────────────────────────────────────{计数器:0}─
utop#数量之比(Int 2);;;
-:比率。比率=2
─( 23:28:29 )─< 命令8>──────────────────────────────────────{计数器:0}─
乌托普

之所以使用
而不是实际表示,是因为顶级(也称为解释器)不知道如何打印
num
对象。使用
#install_printer
指令,可以轻松教授顶层,例如


let pp_num ppf x = Format.fprintf ppf "%s" (Num.string_of_num x);;
val pp_num : Format.formatter -> Num.num -> unit = <fun>
# #install_printer pp_num;;
# ratio_of_num (Int 2);;
- : Ratio.ratio = <ratio 2/1>
# 
然后使用
#install_printer
指令将其安装到顶层

# #install_printer pp_num;;
现在每次我们有
num
时,它都会为我们打印出来

您还可以将此
pp_num
功能与其他
格式
模块功能(用于漂亮打印)一起使用,例如

可能是旧版本的OCaml无法从nums本身导出如何打印比率,因此我们可以通过定义额外的打印机来帮助它

# let pp_ratio ppf r = Format.fprintf ppf "%a" pp_num (num_of_ratio r);;
val pp_ratio : Format.formatter -> Ratio.ratio -> unit = <fun>
# #install_printer pp_ratio;;
# ratio_of_num (Int 2);;
- : Ratio.ratio = 2

它将使用您的操作系统软件包管理器安装系统依赖项(gmp库),然后安装zarith库。

您使用
而不是实际表示的原因是顶级(aka解释器)不知道如何打印
num
对象。使用
#install_printer
指令,可以轻松教授顶层,例如


let pp_num ppf x = Format.fprintf ppf "%s" (Num.string_of_num x);;
val pp_num : Format.formatter -> Num.num -> unit = <fun>
# #install_printer pp_num;;
# ratio_of_num (Int 2);;
- : Ratio.ratio = <ratio 2/1>
# 
然后使用
#install_printer
指令将其安装到顶层

# #install_printer pp_num;;
现在每次我们有
num
时,它都会为我们打印出来

您还可以将此
pp_num
功能与其他
格式
模块功能(用于漂亮打印)一起使用,例如

可能是旧版本的OCaml无法从nums本身导出如何打印比率,因此我们可以通过定义额外的打印机来帮助它

# let pp_ratio ppf r = Format.fprintf ppf "%a" pp_num (num_of_ratio r);;
val pp_ratio : Format.formatter -> Ratio.ratio -> unit = <fun>
# #install_printer pp_ratio;;
# ratio_of_num (Int 2);;
- : Ratio.ratio = 2

它将使用您的操作系统包管理器安装系统依赖项(gmp库),然后安装zarith库。

奇怪的是,您能否尝试
ocaml
而不是
utop
?也可能是因为您的OCaml非常旧。。。你用的是什么版本?嗯,我只能建议再增加一台打印机,这次是专门针对比率类型的。帖子更新了。回复edit2:你需要做
#需要“num”
在进行其他操作之前,新的打印很好,只是新函数不仅可以打印,而且可以简化表达式,例如'div_num(Int 3)(Int 5)`和
div_num(Int 10)(Int 5)
,它们将被相应地打印为
3/5
2
。欢迎)说声谢谢就足够了)这很奇怪,你能试试
ocaml
而不是
utop
?也可能是因为您的OCaml非常旧。。。你用的是什么版本?嗯,我只能建议再增加一台打印机,这次是专门针对比率类型的。帖子更新了。回复edit2:你需要做
#需要“num”
在进行其他操作之前,新的打印很好,只是新函数不仅可以打印,而且可以简化表达式,例如'div_num(Int 3)(Int 5)`和
div_num(Int 10)(Int 5)
,它们将相应地打印为
3/5
2
。不客气)说声谢谢就足够了)我必须提到这是第6666个带标签的问题[ocaml]。恭喜!哇,谢谢!Jejei必须提到这是第6666个带标记[ocaml]的问题。恭喜!哇,谢谢!杰杰
let pp_num ppf x = Format.fprintf ppf "%s" (Num.string_of_num x)
# #install_printer pp_num;;
Format.printf "my num = %a" pp_num (ratio_of_num (Int 2))
# let pp_ratio ppf r = Format.fprintf ppf "%a" pp_num (num_of_ratio r);;
val pp_ratio : Format.formatter -> Ratio.ratio -> unit = <fun>
# #install_printer pp_ratio;;
# ratio_of_num (Int 2);;
- : Ratio.ratio = 2
opam depext --install zarith