OCaml中相邻元素的成对交换

时间:2015-02-24 18:57:40

标签: ocaml

到目前为止我已经

let flipeven(listname)=
    let newlist= [] in
    let first=0 in
    let second=1 in 
    let stop= List.length(listname)-1 in
let rec flipevenhelper (x,y)=
if (second<= stop) then
    insert((List.nth(listname) x), newList) in
    insert((List.nth(listname) y), newList) in 
    let second=second+2 in
    let first=first+2 in
    flipevenhelper (first, second)
else
    newList;;

但是只是在else语句中收到语法错误。我究竟做错了什么?

编辑:

这是插入功能

let rec insert (x,y) = match (x, y) with
| (x,[ ]) -> x::[]
| (x,y::ys) -> if (x>y) then (y:: insert(x, ys))
    else (x::y::ys);;

1 个答案:

答案 0 :(得分:3)

in关键字始终与let关键字配对。这不是加入两个表达式的一般方法,这是你似乎想要的。

OCaml 中的;运算符将两个表达式连接到一个表达式中。第一个表达式被计算但后来被忽略(它应该有unit类型)。计算第二个表达式,其值是组合表达式的值。

请注意,;的优先级低于if/then/else(在某种意义上)。因此,如果您使用then运算符,则应在;之后对表达式加以括号。

这是一个小例子:

# if 3 > 2 then Printf.printf "yes\n"; 4 else 5;;
Error: Syntax error

# if 3 > 2 then (Printf.printf "yes\n"; 4) else 5;;
yes
- : int = 4

修复语法后,仍有许多问题需要解决。特别是,您应该意识到OCaml中的变量和列表是不可变的。您只需拨打newList即可将insert插入到列表中。