簡體   English   中英

OCaml中的列表匹配

[英]List matching in OCaml

我有正在Ocaml中使用的功能。 它包含一個接受兩個字符串列表並返回一個字符串列表的函數。 該功能的操作如下。 它掃描第一個列表中的每個字符串,如果在第二個列表中找到相應的匹配項,則返回該匹配項。 如果第二個列表有重復的匹配項,則該匹配項將返回兩次。 這是我編寫的描述預期行為的測試用例:

let test () : bool =
  (in_both [] ["Pearl"; "Steven"]) = []
;; run_test "in_both empty name list 1" test

let test () : bool =
  (in_both ["Pearl"; "Steven"] []) = []
;; run_test "in_both empty name list 2" test

let test () : bool =
  (in_both ["Pearl"; "Amethyst"; "Henry"] ["Pearl"; "Steven"]) = ["Pearl"]
;; run_test "in_both one repeat in both lists" test

let test () : bool =
  (in_both ["Pearl"; "Amethyst"; "Gary"; "Blair"] ["Pearl"; "Amethyst"; "Blair"]) 
  = ["Pearl";"Amethyst";"Blair"]
;; run_test "in_both three different repeats in both lists" test

let test () : bool =
  (in_both ["Garnet"; "Amethyst"; "Pearl"] ["Pearl"; "Pearl"]) 
  = ["Pearl";"Pearl"]
;; run_test "in_both two repeat in second list" test

這是我的函數實現:

let rec in_both (names1: string list) (names2: string list) : string list =
  begin match (names1, names2) with
  |([],[])-> []
  |([],hd2::tl2)-> []
  |(hd1::tl1,[])-> []
  |(hd1::tl1,hd2::tl2)->if contains_str names2 hd1 = true then hd1::in_both tl1 
  tl2 else in_both tl1 names2
  end

我所有的測試都通過了,除了最后一個測試,看起來好像"Pearl"在應有的時候沒有打印兩次。 我在實施中可能做錯了什么? 作為參考,這是我在in_both中調用的contains_str函數的函數定義:

let rec contains_str (l: string list) (name: string) : bool =
  begin match l with
  |[]-> false
  |hd::tl-> hd = name || contains_str tl name
  end

任何幫助表示贊賞!

一種查看方法是, contains_str太弱,無法執行您想要的操作。 您想知道字符串出現了多少次,而不僅僅是是否出現。 您可能會考慮一個函數,該函數返回字符串列表b中字符串a的出現列表(如果沒有出現,則為空)。

另外,這是您當前代碼似乎無法正確處理的另一種情況:

# in_both ["a"; "b"] ["b"; "a"];;
- : string list = ["a"]

在我看來,沒有理由僅因為在其中找到了hd1而移到第二個列表( tl2 )的tl2 第二個列表的開頭可能出現在第一個列表的后面。

暫無
暫無

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

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