我需要檢查,如果列表與另一個開始,短名單。功能,使用時當後衛很簡單:如何使用Active Pattern編寫startsWith列表函數,而不是在何時使用?
let rec startsWith l1 l2 =
match l1, l2 with
| [], _ | _, [] -> true
| x::xs, y::ys when x = y -> startsWith xs ys
| _ -> false
let lst1 = [ 1; 2; 1 ]
let lst2 = [ 1; 2; 1; 2; 3; ]
let lst3 = [ 1; 3; 1; 2; 3; ]
let c1 = startsWith lst1 lst2 // true
let c2 = startsWith lst1 lst3 // false
但無論我一起上的有源圖案的線嘗試:
let (|HeadsMatch|) (l1 : ('a) list) (l2 : ('a) list) =
if l1.Head = l2.Head then Some(l1.Tail, l2.Tail) else None
let rec startsWith l1 l2 =
match l1, l2 with
| [], _ | _, [] -> true
| HeadsMatch /* need to capture the result */ -> startsWith t1 t2
| _ -> false
我不能讓編譯。如何使用Active模式創建此功能的版本?如果這是不可能的,你能解釋爲什麼嗎?
P.S.任何其他不錯的方法來編寫上述功能?
編輯:我把片段從丹尼爾的回答,從真正的問題不分散。
編輯:開始在開始我的問題。我所定義的活躍模式功能
let (|HeadsMatch|_|) lst1 lst2 =
,但它應該是
let (|HeadsMatch|_|) (lst1, lst2) =
在這種情況下,將匹配在接受的答案。
forall2因爲長度不同而拋出 –
它是固定的。這應該是'Seq.forall2',它忽略了較長列表的其餘元素。 – Daniel
有些人皺起眉頭,並說活動模式是一種避免它的方法。這是我的問題。 –