如何在Bigarray中对GADT进行模式匹配?

wye*_*r33 2 ocaml gadt

如何在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

Dru*_*rup 5

使用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,它将是布局类型。通过布局上的图案匹配,您可以发现实际上与哪种布局类型相等。