我必须创建一个函数,该函数将list列表并返回第一个和最后一个元素对的列表,第二个和第二个倒数第二个,依此类推列表是否具有偶数或奇数个元素都没有关系,因为奇怪的是,我只是忽略了中间元素。我的想法是,使一个新的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 [] ;;
答案 0 :(得分:1)
您的代码中有很多错误。
我认为您看到的具体错误是由于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 ...
,将两个相似的变量定义为两个相似的值看起来更好。)
答案 1 :(得分:0)
以下代码至少应编译:
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
的预期作用,这可能会有所帮助。