我正在用一些组合学实用工具编写一个小脚本。当我需要不同类型的数字文本(如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)发布于 2015-12-24 09:10:52
总之,没有。Camlp4是非类型化解析树的预处理器。它不能做这种类型敏感的事情。
如果您需要(我敢打赌您不会),您可以对Camlp4中的非类型化解析树执行类型检查,并推断出特殊数字的类型,然后用相应的值替换它们。这在理论上是可能的,但从未尝试过,因为P4的解析树与OCaml的解析树完全不同。
PPX预处理器是用来取代Campl4的,它有一些希望,因为它处理与OCaml相同的非类型化的解析树,因此很容易应用OCaml类型检查器。TyPPX (https://bitbucket.org/camlspotter/typpx)是一个为类型相关的预处理提供API的框架。
发布于 2015-12-24 16:20:05
您可能需要查看定界超载 --它需要通过将表达式e包围为M.(e)来限定常量,其中M是模块的名称(您可以定义别名)。
https://stackoverflow.com/questions/34447891
复制相似问题