OCaml函数名称为字符串

时间:2015-11-16 15:20:59

标签: ocaml

我有时会编写假设某些参数不会发生的函数。如果他们这样做,这是一个错误,我失败了:

let foo = function
 | 0 -> ()
 | _ -> failwith "foo: bad argument"

如果我稍后重命名该功能,我必须记住也要更改字符串。有没有办法以更系统的方式做到这一点?我的思绪在像

这样的解决方案中徘徊
| _ -> failwith (FUNCTION_NAME ^ ": bad argument")

其中FUNCTION_NAME是编译器或解释器将实例化的字符串变量。但我不知道这样的事情是否适用于OCaml。如果没有,是否有最佳做法?

2 个答案:

答案 0 :(得分:9)

有一组值可用于调试和错误报告。它们都不是函数名称,但如果您不想按@SteveVinoski的建议使用assert false,它们可能会很有用。

__LOC__ : string
__FILE__ : string
__LINE__ : int
__MODULE__ : string
__POS__ : string * int * int * int

您还可以使用更好的表单来包装表达式以确定其在源中的范围。

这些内容记录在Pervasives模块中。

答案 1 :(得分:1)

我认为您应该尝试尽可能多地使用更具体的类型,以便编译器可以阻止您使用无效输入调用函数。 如果你真的找不到告诉类型系统你想要什么的方法,那就更加努力,如果你真的不能,那就用史蒂夫告诉你的assert会给你一些宝贵的调试信息(文件和行号比函数名更有用,因为机会很高,你的函数没有名字)。