比方说,我写这篇文章的代码:
# type t = A of int * int
let f = function A (i1, i2) -> print_int i1;;
type t = A of int * int
val f : t -> unit = <fun>
完美的,它的工作原理。
现在,让我们说我有这样的功能:
# let print_couple (i1, i2) = print_int i1; print_int i2;;
val print_couple : int * int -> unit = <fun>
因此,当你想到,我想写以下
# let f = function A (_ as c) -> print_couple c;;
好吧,我不能
Error: The constructor A expects 2 argument(s),
but is applied here to 1 argument(s)
我不知道,是不是因为的_
或括号(我认真了有关质疑,但我想是详尽的)?
# let f = function A _ -> failwith "Fight me"
let g = function A (_) -> failwith "1o1";;
val f : t -> 'a = <fun>
val g : t -> 'a = <fun>
不,这是不是...
哦,也许我必须表明我知道我有两个参数的编译:
# let f = function A ((_, _) as c) -> print_couple c;;
Error: The constructor A expects 2 argument(s),
but is applied here to 1 argument(s)
但是...如果我写
# let f = function A (_, _) -> failwith "Puppey style";;
有用。 那么,为什么,因为编译器知道我在等一对夫妇,我甚至试图把它给他它不断失败? 难道写A (_ as c)
我命名,无论什么时候,第一个参数? 很奇怪,不是吗?
我的意思是,如果我写的
# let rec f = function
| [] -> ()
| hd :: tl -> print_couple hd; f tl;;
val f : (int * int) list -> unit = <fun>
编译器不会打扰我,这个名单是一个关联列表或一个整数列表? 然后就是很奇怪,从我期望从相同的行为
# match a with
| A c | A (_ as c) | A ((_, _) as c) -> ()
?