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'
提前致谢!
问题是优先考虑的问题.函数应用程序的优先级高于任何运算符,包括:::
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)
| 归档时间: |
|
| 查看次数: |
92 次 |
| 最近记录: |