[英]F# : need help reversing order of ilist
我必須使用以下數據類型:
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
非常丑陋,您只應在極failwith
情況下使用。
另請注意,您的第二個匹配項| L(h, E) -> h
| L(h, E) -> h
是錯誤的,因為它返回一個int
而不是一個ilist
。 但是無論如何都不需要它,因此只需將其刪除。 單例列表L (h,E)
將與| L (h,t) -> ...
匹配| L (h,t) -> ...
| L (h,t) -> ...
而是依次遞歸地將t
與| E -> E
匹配| E -> E
| E -> E
這是一個工作示例: https : //repl.it/repls/PhonyAdventurousNet
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.