我在模式匹配中对此进行了调整
| {call_name = #bundle_source; _ }
在代码的前面,bundle_source
被定义为一种类型(type bundle_source = ...
)。
哈希标志是什么意思?模式匹配中的{call_name = #bundle_source }
是否意味着call_name
的值应该具有bundle_source
类型?
我在the manual搜索了“哈希标志”和“英镑标志”但没有找到任何内容。
答案 0 :(得分:10)
这是构建与多态变体值集合匹配的模式的简写。
文档位于OCaml手册的Section 6.6中:
如果定义了类型
[('a,'b,…)] typeconstr = [ ` tag-name1 typexpr1 | … | ` tag-namen typexprn]
,则模式#typeconstr
是以下or模式的简写:( `tag-name1(_ : typexpr1) | … | ` tag-namen(_ : typexprn))
。它匹配[< typeconstr ]
类型的所有值。
# type b = [`A | `B];;
type b = [ `A | `B ]
# let f x =
match x with
| #b -> "yes"
| _ -> "no";;
val f : [> b ] -> string = <fun>
# f `A;;
- : string = "yes"
# f `Z;;
- : string = "no"
(我也不熟悉这种表示法。)
答案 1 :(得分:3)
作为模式中#typeconstr
的使用的补充,类型表达式#class-path
表示类#class_path
的子类型。例如,
class c = object method m = () end
class d = object inherit c method n = () end
let f (x:c) = ()
let g (x:#c) = ()
电话f (new d)
失败,
Error: This expression has type d but an expression was expected of type c.
The second object type has no method n
因为f
完全需要c
类型的对象,而类型检查器接受g (new d)
,因为d
是c
的子类(请注意,也可以接受`g(对象方法m =()结束)。