我正在编写一个带有一些组合工具的小脚本。当我需要不同类型的0
或1
等数字文字时,我会使用_0
和_1
,但此解决方案并不理想。是否可以使用Camlp4重新解释给定上下文中的数字文字或添加具有专用后缀的新类型的数字文字?
open Num
let zero = num_of_int 0
let one = num_of_int 1
let _0 = zero
let _1 = one
(* some useful infix operators *)
let ( + ) = ( +/ )
let ( - ) = ( -/ )
let ( * ) = ( */ )
let ( < ) = ( </ )
let ( > ) = ( >/ )
let ( = ) = ( =/ )
let ( / ) numer denom =
if mod_num numer denom = _0
then div_num numer denom
else invalid_arg "division is not a total function"
(* factorial, naive *)
let rec fact n =
if n < _0
then invalid_arg "negative factorial"
else if n = _0
then _1
else
n * fact (n - _1)
(* naive algorithm *)
let choose n k = (fact n / fact k) / fact (n - k)
答案 0 :(得分:1)
简而言之,没有。 Camlp4是无类型解析树的预处理器。它不能做这种类型敏感的事情。
如果你想要(而且我打赌你不会),你可以对Camlp4中的无类型解析树进行类型检查,并推断出你的特殊数字的类型,然后用相应的值替换它们。理论上可行,但没有人尝试过,因为P4的解析树与OCaml完全不同。
PPX预处理器,用于取代Campl4,有一些希望,因为它处理与OCaml相同的无类型解析树,因此很容易应用OCaml类型检查器。 TyPPX(https://bitbucket.org/camlspotter/typpx)就是为类型相关的预处理提供API的框架。
答案 1 :(得分:1)
您可能希望查看delimited overloading - 它需要通过将e
与M.(e)
括起来来限定常量,其中M
是模块的名称(您可以定义别名)。