我真的不明白发生了什么。我有以下代码:
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 -> ...
看到的那样,它之前已经让我烦恼了)?如果是,我应该使用哪种标签?在哪里?
答案 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
添加标签,它将尝试将第二个参数与函数统一。这就是为什么你有这么奇怪的错误信息。