簡體   English   中英

Ocaml 列表遞歸

[英]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:: equivlst和您 append 這個列表到遞歸調用, compareVal等於unequiv的頭部並將遞歸調用應用於unequiv

在另一種情況下,您只需將列表的頭部 append 進行遞歸調用,其中僅修改檢查的列表。

我們可以從您的代碼中知道什么?

  • 既然你寫a:: ba'a類型, b'a list
  • 你寫xa compareVal = true所以x是類型'a -> 'b -> bool並且compareVal是類型'b
  • a:: isEqual...表示isEqual返回類型為'a list的元素
  • b:: equiv用作lst的第一個參數,因此其類型應與a:: b相同,但問題是, bb:: equiv中用作頭部,因此其類型為'a和 as a:: b中的尾部,所以它的類型是'a list 這種類型是無限遞歸的,OCaml 不會讓你這樣做(有充分的理由)。

嘗試准確地編寫您想要的內容,將其划分為較小的問題並相應地編寫您的代碼,否則您將很快迷失方向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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