F#:需要帮助反转ilist的顺序吗

F#:需要帮助反转ilist的顺序吗,list,f#,List,F#,我必须使用以下数据类型: type ilist = E | L of int * ilist 在处理标准类型以外的联机列表([1;2;3])方面,我似乎找不到太多帮助 我要写一个函数,它接受列表并反转顺序 例如:反向(L(1,L(2,L(3,E)))将输出(L(3,L(2,L(1,E))) 到目前为止,我的代码如下: let rec reverse l = match l with | E -> failwith "Empty List" | L(h,

我必须使用以下数据类型:

type ilist = E | L of int * ilist
在处理标准类型以外的联机列表([1;2;3])方面,我似乎找不到太多帮助

我要写一个函数,它接受列表并反转顺序

例如:反向(L(1,L(2,L(3,E)))将输出(L(3,L(2,L(1,E)))

到目前为止,我的代码如下:

 let rec reverse l = 
     match l with 
     | E -> failwith "Empty List"
     | L(h, E) -> h
     | L(h, t) -> // append tail and recursive call with rest of list?

 let list = reverse (L(1, L(2, L(3, E))))
 printfn "reversed list: %A" list

谢谢你的帮助

您缺少的是将
int
附加到
ilist
的便捷方法:

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

printfn "%A" (append 4 list)
现在,在上一个匹配案例中使用此函数将
h
附加到反向的
t

let rec reverse l = 
  match l with 
  | E       -> E
  | L (h,t) -> append h (reverse t)
请注意,当输入列表为空时,最好只返回一个空列表(
|E->E
),因为
failwith
非常难看,您应该只在最罕见的情况下使用

还要注意,第二个匹配用例
|L(h,E)->h
是错误的,因为它返回的是
int
,而不是
ilist
。但它是不需要的,所以只要删除它。单例列表
L(h,E)
将与
|L(h,t)->……
匹配,后者依次递归地将
t
|E->E
匹配


下面是一个工作示例:

的可能重复在链接的重复中,内置列表类型仍在使用,但函数已定义。您只需要将
[]
替换为
E
大小写,将
head::tail
替换为
L(head,tail)
大小写。这看起来像是将列表拆分为子列表?所以我相信这不是一个重复的问题,或者这只是一个参考问题?原来的问题有点不同,但答案是一样的。接受答案中的反向功能应该是您所需要的全部功能。