Ocaml 为什么Num中的有理数打印为<;文章摘要>;?
我继续探索Ocaml的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
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