当OCaml变量以`#`开头时,它是什么意思? (哈希标志/英镑符号)?

时间:2017-05-15 22:47:05

标签: types functional-programming pattern-matching ocaml

我在模式匹配中对此进行了调整

| {call_name = #bundle_source; _ }

source

在代码的前面,bundle_source被定义为一种类型(type bundle_source = ...)。

哈希标志是什么意思?模式匹配中的{call_name = #bundle_source }是否意味着call_name的值应该具有bundle_source类型?

我在the manual搜索了“哈希标志”和“英镑标志”但没有找到任何内容。

2 个答案:

答案 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),因为dc的子类(请注意,也可以接受`g(对象方法m =()结束)。