List 函数式编程中的列表递归#
我正在编写一个递归函数move,它接受两个列表,并以相反的顺序将元素从第一个列表插入第二个列表 我们有一个预定义的列表数据类型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
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
- 你也不需要第二个案例——如果你做对了,第一个和最后一个案例将涵盖你需要的所有选项