OCaml类型错误:枚举示例

3

你好,我是一个新手,正在学习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;;

这段代码无法运行,但是我教授的例子(我认为它们非常相似)可以工作。我的教授的代码如下:

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)))

有人能解释一下为什么我的代码会出现这个错误吗: This expression has type 'a * 'b but an expression was expected of type 'c list
提前感谢!
1个回答

6
问题出在优先级上。函数应用的优先级高于任何运算符,包括::,因此以下代码会出现问题:
inside xs (x,index)::acc (index+1)

被解释为:

(inside xs (x,index)) :: (acc (index+1))

您想要的是:

inside xs ((x,index)::acc) (index+1)

2
在 Stack Overflow 上,这个优先级问题最近一直出现。OCaml 的教师们应该注意到这点,这可能是需要早期解释的内容。 - Jeffrey Scofield

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接