【发布时间】:2018-08-16 22:38:16
【问题描述】:
有没有一种在 OCaml 中简洁地展开代数数据类型的好方法?例如,考虑以下代码,它定义了两种不同类型的数学函数
type ftype =
| Quadratic of {alpha : float; a : float array; aa : float array}
| General of {eval : float array->float}
type myfn = {
nvar : int;
typ : ftype}
let f = {
nvar = 2;
typ = General {eval = fun x-> x.(0) +. x.(1)}}
出于调试目的,有时只评估一个函数或在顶层检查它的值会很好。但是,如果我们想要计算 f,我们需要一个看起来像
的代码let x = [| 1.; 2. |]
let y = match f.typ with General(f) -> f.eval(x)
这有点难看,而且打字很痛苦,尤其是在分层很深的情况下。我想定义某种语法,例如
let y = f.typ.General.eval(x)
而且,是的,代码不安全,无法编译。也就是说,接近这个的东西对于调试目的来说是很好的,这样我们就不必编写一段冗长的代码来解包一个值。有什么好的方法可以做到这一点吗?
【问题讨论】:
-
您可以使用 let 绑定进行解构:
let y = let { typ = General(f) } = f in f.eval(x)。可以说不那么难看,但在这种情况下肯定不会更短。然而,它会更好地处理嵌套。
标签: ocaml algebraic-data-types