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

时间:2018-09-06 17:34:10

标签: 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, 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

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您缺少的是将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匹配。

这是一个有效的示例:https://repl.it/repls/PhonyAdventurousNet