在corebuild下编译时出现奇怪的错误

时间:2014-02-06 07:38:13

标签: ocaml

我真的不明白发生了什么。我有以下代码:

let rec interleave n l = 
match l with
  [] -> [[n]]
  | head::tail -> (n::l)::(List.map (~f:fun y -> head::y) (interleave n tail))
in let rec aux l =
match l with
  [] -> [l]
  | head::tail -> List.concat ( List.map (interleave head) (aux tail) )

使用 ocaml 进行编译时,它会按预期编译并运行,但在 corebuild 下,它会出现以下错误:

  

表达式的类型为'a list - >列表列表,但表达式是   期望类型'b list

它是否与标签有关(正如您从~f:fun y -> ...看到的那样,它之前已经让我烦恼了)?如果是,我应该使用哪种标签?在哪里?

1 个答案:

答案 0 :(得分:2)

您需要重读有关标记参数的部分手册。

let rec interleave n l = 
match l with
  | [] -> [[n]]
  | head::tail -> (n::l)::(List.map ~f:(fun y -> head::y) (interleave n tail))
and aux l =
match l with
  | [] -> [l]
  | head::tail -> List.concat ( List.map ~f:(interleave head) (aux tail) );;

N.B。标记参数的正确语法为~label:expression

N.B。在Core List.map函数中有类型'a list -> f:('a -> 'b) -> 'b list,如果您忘记向函数f添加标签,它将尝试将第二个参数与函数统一。这就是为什么你有这么奇怪的错误信息。