List 函数式编程中的列表递归#

List 函数式编程中的列表递归#,list,recursion,f#,functional-programming,List,Recursion,F#,Functional Programming,我正在编写一个递归函数move,它接受两个列表,并以相反的顺序将元素从第一个列表插入第二个列表 我们有一个预定义的列表数据类型 type ilist = E | L of int * ilist 例如: move L(2, L(3, E)) L(1, L(2, E)) 会给我 L(3, L(2, L(1, L(2)))) 我想我的代码有语法错误。还不确定是否可以使用cons进行前置,因为它是预定义的列表数据类型。感谢您的帮助 let rec move l r = match l with

我正在编写一个递归函数move,它接受两个列表,并以相反的顺序将元素从第一个列表插入第二个列表

我们有一个预定义的列表数据类型

type ilist = E | L of int * ilist
例如:

move L(2, L(3, E)) L(1, L(2, E)) 
会给我

L(3, L(2, L(1, L(2))))
我想我的代码有语法错误。还不确定是否可以使用cons进行前置,因为它是预定义的列表数据类型。感谢您的帮助

let rec move l r =
match l with
 | E -> []
 | L(h,E) -> h::r
 | L(h,t) -> move t r

函数中有几个语法错误和类型检查错误。您需要正确地缩进内容,并将示例调用的参数括起来。由于要返回现有列表(类型为
ilist
),还需要将右侧实现中的
[]
::
替换为构造函数
L
E
。解决这些问题可以提供:

let rec move l r =
  match l with
  | E -> E
  | L(h,E) -> L(h, r)
  | L(h,t) -> move t r

move (L(2, L(3, E))) (L(1, L(2, E)))
这是可行的,但它并不完全正确。要使其真正发挥作用,您需要:

  • 在第一种情况下,如果调用
    move E(L(1,E))
    您应该返回
    L(1,E)
    ,但是您的实现只返回
    E
    。您需要返回
    r
  • 在最后一种情况下,您没有使用
    h
    ,因此它将被删除。您需要使用
    L
    构造函数将其附加到
    r
    值或递归调用的结果中
  • 你也不需要第二个案例——如果你做对了,第一个和最后一个案例将涵盖你需要的所有选项

函数中有几个语法错误和类型检查错误。您需要正确地缩进内容,并将示例调用的参数括起来。由于要返回现有列表(类型为
ilist
),还需要将右侧实现中的
[]
::
替换为构造函数
L
E
。解决这些问题可以提供:

let rec move l r =
  match l with
  | E -> E
  | L(h,E) -> L(h, r)
  | L(h,t) -> move t r

move (L(2, L(3, E))) (L(1, L(2, E)))
这是可行的,但它并不完全正确。要使其真正发挥作用,您需要:

  • 在第一种情况下,如果调用
    move E(L(1,E))
    您应该返回
    L(1,E)
    ,但是您的实现只返回
    E
    。您需要返回
    r
  • 在最后一种情况下,您没有使用
    h
    ,因此它将被删除。您需要使用
    L
    构造函数将其附加到
    r
    值或递归调用的结果中
  • 你也不需要第二个案例——如果你做对了,第一个和最后一个案例将涵盖你需要的所有选项