如何在GADT上进行模式匹配?在这种情况下,我在使用Bigarray的GADT时遇到了麻烦。更具体地说,代码
let print_layout v = match Bigarray.Genarray.layout v with
| Bigarray.C_layout -> Printf.printf "C layout\n"
| Bigarray.Fortran_layout -> Printf.printf "Fortran layout\n"
Run Code Online (Sandbox Code Playgroud)
无法编译错误消息
Error: This pattern matches values of type
Bigarray.fortran_layout Bigarray.layout
but a pattern was expected which matches values of type
Bigarray.c_layout Bigarray.layout
Type Bigarray.fortran_layout is not compatible with type
Bigarray.c_layout
Run Code Online (Sandbox Code Playgroud)
它在抱怨这个Bigarray.Fortran_layout案子。如果我们看一下Bigarray我们看到,
type c_layout = C_layout_typ
type fortran_layout = Fortran_layout_typ
type 'a layout =
C_layout : c_layout layout
| Fortran_layout : fortran_layout layout
Run Code Online (Sandbox Code Playgroud)
因此,这是GADT,我在模式匹配方面做错了。什么是工作版本print_layout?
使用gadts时,通常需要在进行通用模式匹配时添加注释(该模式应适用于一种类型的所有构造函数)。
这是做您想做的正确方法:
let print_layout (type t) (v: (_,_,t) Bigarray.Genarray.t) =
match Bigarray.Genarray.layout v with
| Bigarray.C_layout -> Printf.printf "C layout\n"
| Bigarray.Fortran_layout -> Printf.printf "Fortran layout\n"
Run Code Online (Sandbox Code Playgroud)
注释引入了抽象类型t,它将是布局类型。通过布局上的图案匹配,您可以发现实际上与哪种布局类型相等。
| 归档时间: |
|
| 查看次数: |
141 次 |
| 最近记录: |