OCaml:如何确定函数参数的类型?

时间:2014-01-07 09:36:51

标签: types ocaml matching

我了解到可以创建接受任意类型的函数,如下所示:

let f x = x;;

let f x = ();;

let f (x : 'a) = ();;

但我找不到在函数内部使用类型信息的方法,如下所示:

let print_is = function
    | (x : int) -> print_int x
    | (s : string) -> print_string s
    | _ -> print_string "***";;

这根本不可能,如果是这样的话 - 这种限制的根本想法是什么?或者我只是没有正确地进行谷歌?

1 个答案:

答案 0 :(得分:2)

OCaml在运行时不保留类型信息:为了编写您建议的程序,需要匹配x类型,因此需要一个表示x类型的值,以便对其进行模式匹配。

我认为有两种方法可以进一步回复您的问题:

  • 检查参数的类型并构建表示所述类型的值是一个仍在积极研究的研究问题:很难以类型安全的方式执行这些操作,而且不会破坏抽象。 GrégoireHen目前正在这样做,似乎正在https://github.com/c-cube/ocaml-ty
  • 分享他的作品
  • 如果您正在寻找打印任意值的方法,OCaml的自然方式是直接使用“正确”功能打印您想要的类型,因为 OCaml中没有通用打印机。话虽如此,还有额外的库,例如deriving,可以为您的类型定义生成自动打印机。