我必须创建一个函数,列表列表并返回第一个和最后一个元素,第二个和第二个元素对的列表,依此类推如果列表具有偶数或奇数个元素无关紧要,因为如果它的奇数我将只是忽略了中间元素。我的想法是创建一个新的rec乐趣,将旧列表及其反转作为输入我认为我完成了代码,但我得到了语法错误;;
let lip l =
if [] then []
else let l1=l l2=List.rev l in
let rec lp l1 l2 = match l1,l2 with
| [],[] ->[]
| [],h2::t2->[]
| h1::_,h2::_ ->
if (List.length l -2) >= 0 then [(h1,h2)]@ lp(List.tl l1) t2
else [] ;;
您的代码中存在相当多的错误。
我认为你看到的具体错误是由于in
之后没有let rec lp ...
这一事实。
每个不在模块顶层的let
都需要跟随in
。想到它的一种方法是,它是一种声明局部变量的方法,用于在in
之后出现的表达式。但你需要有in expr
。
另一种看待它的方法是你定义一个名为lp
的函数,但你不是在任何地方调用它。
正如@ lambda.xy.x指出的那样,你不能说if [] then ...
因为[]
不是bool
类型。你不能说let x = e1 y = e2 in ...
。正确的形式是let x = e1 in let y = e2 in ...
(或者你可以编写let x, y = e1, e2 in ...
,它看起来更好,可以将两个相似的变量定义为两个相似的值。)
以下代码至少应该编译:
let lip list1 =
if list1 = [] then []
else
let list2=List.rev list1 in
let rec lp l1 l2 = match l1,l2 with
| [], [] ->[]
| [], _::_->[]
| h1::_::_, h2::t2 -> (* l1 length >= 2*)
(h1,h2) :: lp(List.tl l1) t2
| h1::_,h2::t2 -> (* l1 length = 1 *)
[]
in
[]
我做了以下更改:
lip
的论点,以明确它们与lp
的论点不同let l1 = l
| [h1, _] -> ...
可能更好lp
的定义需要跟随lip
的实际身体 - 为了使它编译,我们现在只返回[]
但你可能想要其他东西那里正如@Jeffrey Scofield已经提到的那样,你没有在代码中使用lp
。如果你添加一条评论来解释你想要实现的目标以及lp
的预期作用,它可能会有所帮助。