1

我正在编写一个带有一些组合实用程序的小脚本。当我需要类似01不同类型的数字文字时,我使用_0and _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)
4

2 回答 2

1

简而言之,没有。Camlp4 是无类型解析树的预处理器。它不能做这种类型敏感的事情。

如果您愿意(我敢打赌您不会),您可以对 Camlp4 中的无类型解析树运行类型检查并推断您的特殊数字的类型,然后用相应的值替换它们。这在理论上是可能的,但没有人尝试过,因为 P4 的解析树与 OCaml 的解析树完全不同。

旨在取代 Campl4 的 PPX 预处理器有一些希望,因为它处理与 OCaml 相同的无类型解析树,因此很容易应用 OCaml 类型检查器。TyPPX ( https://bitbucket.org/camlspotter/typpx ) 就是这样一个框架,为类型相关的预处理提供 API。

于 2015-12-24T09:10:52.057 回答
1

你可能想看看定界重载——它需要通过在表达式周围e加上模块名称来限定你的常量(你可以定义别名)。M.(e)M

于 2015-12-24T16:20:05.943 回答