[英]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.