让OCaml模式重建
所以我注意到可以用“let”表达式来重建任何模式,即使它是一个函数声明。
它在以下情况下非常有用:
let [c; f; x] = map (fun _ -> scanf " %f" id) (1--3) in ...
然而,这会发出警告,因为这种模式并不详尽:事实上,它可能会失败。 但就我而言,这恰好是模式不匹配时的预期行为(以及我对输入的断言是错误的):语句应该失败(并且失败可能在堆栈的某个时刻被捕获)。
我不喜欢有这些警告(并且我不想全局关闭它们!),所以我不得不退回到非常繁琐(并且不安全)的问题上:
let c, f, x = match (map (fun _ -> scanf " %f" id) (1--3)) with
| [c; f; x] -> c, f, x
| _ -> failwith "wrong assertion"
in ...
在没有可怕的警告的情况下,没有办法获得第一个替代方案的简洁语法吗? 还是另一种构建方式,比起完整的匹配语句,输入的内容更少?
注意:我认为能够指定一个函数只需要一个给定的总和类型的替代品而不会在声明站点发出警告也是很好的。 这将是呼叫者确保他使用正确的参数,否则他会得到一个警告......
type ast = Id of string | Var of string * int
let foo (Var(s,n)) = ...
foo (Var("bar", 42)) (* ok *)
foo (Id "bar") (* warning; or even error *)
(这是因为对我来说,像“foo sn”这样的签名并没有说清楚foo是否与Var构造的ast的数据一起使用。)
你可以使用不同的类型:
type ast = [`Id of string | `Var of string * int]
let foo (`Var (s, n)) = (s, n)
(* val foo : [< `Var of 'a * 'b ] -> 'a * 'b *)
foo (`Var("bar", 42)) (* : string * int = ("bar", 42) *)
foo (`Id "bar") (* Error: This expression has type [> `Id of string ] *)
链接地址: http://www.djcxy.com/p/62637.html
上一篇: OCaml pattern reconstruction with let
下一篇: Pattern matching language knowledge, pattern matching approach