[英]OCaml - Tail Recursion to convert array to list
我想用尾部遞歸輔助函數編寫函數以將數組轉換為列表。
例:
#arraytolist [|"a";"b"|];;
- :string list = ["a";"b"]
#arraytolist [||];;
- :'alist = []
這是我的代碼:
let arraytolist arr =
let rec helper alist index =
if arr = [||] then []
else helper (arr.(index))::(List.tl alist) index+1
in helper [] 0;;
Error: This expression has type int -> 'a list
but an expression was expected of type 'a
The type variable 'a occurs inside int -> 'a list
您的代碼有多個問題。
第一個也是最直接的問題是,您沒有在括號內正確地遞歸調用helper
。 如有疑問,應將整個參數放在括號中。 我認為它目前正在像這樣解析它: (helper arr.(index)) :: (((List.tl alist) index) + 1)
。
第二個是您的基本情況是arr = [||]
當arr
永不改變時)。 因此,只有當arr
最初為空時,這才是正確的,否則遞歸不會終止。 當然,除非index
超出范圍並導致程序崩潰,否則將導致崩潰,因為您沒有檢查它。
第三個問題是您的函數將始終返回一個空列表,因為這是您在基本情況下返回的內容(如果條件正確)。 您所做的所有其他操作都將被丟棄。 有一種編寫函數的方法,在這種情況下,有必要返回一個空列表作為基本情況,而且似乎在嘗試中途,但這並不是尾遞歸。 您將希望遞歸調用是每次迭代的最后一個操作,而不是遞歸調用結果的cons操作。
第四個問題是您使用List.tl
在每次迭代中都丟棄了alist
的頭,這將在第一次迭代中失敗,因為alist
最初是空的。 如果不是這樣, alist
永遠只能包含處理的最后一個元素。
我希望這能給您足夠的機會去解決它。 基本思想似乎很好; 您只需要清除錯誤。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.