[英]Ocaml list recursion
到目前為止,這就是我的代碼:
let equiv=[];;
let unequiv=[];;
let rec isEqual equiv unequiv compareVal x lst =
match lst with
|[]->[]
|a::b-> if x a compareVal=true then (a::isEqual equiv unequiv compareVal x b::equiv) @ (isEqual equiv unequiv (List.hd unequiv) x unequiv)
else a::isEqual equiv unequiv compareVal x b::unequiv
然而,當我運行它給我一個錯誤:圖片
我的預期 output 應該如下所示: [[a,v,c],[s,f,t]] 我的邏輯有缺陷嗎?
您的代碼很難閱讀,您應該將其分解:
據我了解,如果您的列表不為空,請檢查xa compareVal
是否為true
,這可以簡化為if xa compareVal
。
在這種情況下,您將列表的頭部放在遞歸調用的前面,其中幾乎所有內容都保持不變,除了轉換為b:: equiv
的lst
和您 append 這個列表到遞歸調用, compareVal
等於unequiv
的頭部並將遞歸調用應用於unequiv
。
在另一種情況下,您只需將列表的頭部 append 進行遞歸調用,其中僅修改檢查的列表。
我們可以從您的代碼中知道什么?
a:: b
, a
是'a
類型, b
是'a list
xa compareVal = true
所以x
是類型'a -> 'b -> bool
並且compareVal
是類型'b
a:: isEqual...
表示isEqual
返回類型為'a list
的元素b:: equiv
用作lst
的第一個參數,因此其類型應與a:: b
相同,但問題是, b
在b:: equiv
中用作頭部,因此其類型為'a
和 as a:: b
中的尾部,所以它的類型是'a list
。 這種類型是無限遞歸的,OCaml 不會讓你這樣做(有充分的理由)。嘗試准確地編寫您想要的內容,將其划分為較小的問題並相應地編寫您的代碼,否則您將很快迷失方向。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.