我必须使用以下数据类型:
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
感谢您的帮助!
答案 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
匹配。