Ocaml类型错误对于枚举示例

Emi*_*iti 3 f# ocaml functional-programming

您好我是OCaml的新手而且我正在尝试学习尾递归的基本语法.我编写了以下代码以获取列表并返回包含元素及其索引的双重列表.例如["b";"c";"dd";] - > [("b",0); ("c",1); ("dd",2)]

我写了以下代码:

let enumerateWithTail lst =
  let rec inside lst acc index =
  match lst with
  | [] -> acc
  | x::xs -> inside xs (x,index)::acc (index+1)
 in inside lst [] 0;;
Run Code Online (Sandbox Code Playgroud)

这不起作用,但我的教授的例子(至少我认为它非常相似)有效.我的教授代码是:

let enumerate lst =
  let rec aux lst acc =
    match lst with
    | [] -> acc
    | x::xs -> let (eList, index) = acc
               in aux xs ((x, index)::eList, index+1)
  in List.rev(fst(aux lst ([], 0)))
Run Code Online (Sandbox Code Playgroud)

有人可以解释为什么我的代码会给出错误:这个表达式有'a*'b类型但是表达式需要'c list'

提前致谢!

Tar*_*mil 6

问题是优先考虑的问题.函数应用程序的优先级高于任何运算符,包括:::

inside xs (x,index)::acc (index+1)
Run Code Online (Sandbox Code Playgroud)

被解释为:

(inside xs (x,index)) :: (acc (index+1))
Run Code Online (Sandbox Code Playgroud)

而你想要的是:

inside xs ((x,index)::acc) (index+1)
Run Code Online (Sandbox Code Playgroud)

  • 这个优先问题最近在SO上反复出现.OCaml的老师应该注意; 它可能是早期解释的东西. (2认同)