簡體   English   中英

OCaml列表語法錯誤

[英]OCaml list syntax error

我正在編寫一個函數,以從具有相同值的列表中刪除鄰居。 我不明白這里的語法錯誤。 這就是我所擁有的:

let rec rem_dup_neighb l = 
let rec rem_dup_neighb_aux l lastseen retl = 
match l with 
 []->retl
|[()]->[()]
| (y::rest) -> if(y==lastseen) then rem_dup_neighb_aux l lastseen retl else rem_dup_neighb_aux l y (y::retl)
in rem_dup_neighb_aux l 9000 [];;

對於函數的最后一行,出現以下錯誤:

Error: This expression has type int but an expression was expected of type
     unit

例如,如果將[1; 2; 2; 3; 5]傳遞給函數,則它應返回[1; 2; 3; 5]

任何幫助表示贊賞。 謝謝

更新:函數似乎是無限循環:

let rec rem_dup_neighb l = 
let rec rem_dup_neighb_aux l lastseen retl = 
match l with []->retl
| (y::rest) -> if(y==lastseen) then rem_dup_neighb_aux l lastseen retl else rem_dup_neighb_aux l y (y::retl)
in
    match l with
    (lastseen::rest) ->  rem_dup_neighb_aux l lastseen []

更新2:並沒有減少每次迭代的問題。 函數現在似乎返回[5; 3; 2],而不是[1; 2; 3; 5]。

let rec rem_dup_neighb l = 
let rec rem_dup_neighb_aux l lastseen retl = 
match l with []->retl
| (y::rest) -> if(y==lastseen) then rem_dup_neighb_aux rest lastseen retl else rem_dup_neighb_aux rest y (y::retl)
in
    match l with
    []->[]
    |(lastseen::rest) ->  rem_dup_neighb_aux l lastseen []

更新3:

let rec rem_dup_neighb l = 
let rec rem_dup_neighb_aux l lastseen retl = 
match l with []->retl
| (y::rest) -> if(y==lastseen) then rem_dup_neighb_aux rest lastseen retl else rem_dup_neighb_aux rest y (y::retl)
in
    match l with
    []->[]
    |(lastseen::rest) ->  rem_dup_neighb_aux l lastseen [lastseen]

如果其中一個測試用例具有[()]作為輸入,則不能將9000用作列表開頭的假值。 您需要具有與列表中相同類型的假值。 一個想法是使用列表的實際第一個值。

順帶一提,似乎您應該把比賽中的第二個案件拿出來。 對於第二種情況,我的意思是(固定代碼之后)匹配長度為一的列表的模式; 即模式[_] 使用您的方法(使用“最后看到的”值),只有兩種情況:空列表和非空列表。 您的特殊問題排在列表的開頭(就像您現在所經歷的那樣),而不是排在最后。

更新

您可以在任何喜歡的地方進行模式匹配( match表達式)。 所以,你可以有一個后in

let rem_dup_neighbors aList =
    let rec aux l lastseen retl =
        ...
    in
    match aList with
    | pattern1 -> blah blah blah
    | pattern2 -> aux blah blah

更新2

遞歸調用自己時,您必須傳遞一個較小的問題。 您的輔助功能只是不斷使用相同的列表進行調用。

match子句[()] -> [()]接受並產生一個unit list ,在這里並沒有什么意義。 您可能應該已經編寫了[_] -> retl_是用於“匹配任何內容”的匹配語法。

暫無
暫無

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

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