簡體   English   中英

F#:需要幫助反轉ilist的順序

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM