2013-11-24 36 views
2

我在F#的工作,並有一個類型T這幾件事情的區分聯合:能否定義一個函數來判斷一個元素是否是由給定的類型構造函數構造的?

type T = 
    | A of string * int 
    | B of int 
    | C 

如果我有一件T名單,我可能要拉出來使用A構建的東西它很容易模式匹配這樣的:

myList 
|> List.filter (fun x -> match x with | A(_,_) -> true | _ -> false) 

嵌入的比賽是有點冗長,而且也與A.我想的定義保持同步下劃線的數量較小的維修麻煩真的像功能如下:

let constructedFrom (type constructor) (t : T) : bool = something 

myList 
|> List.filter (constructedFrom A) 

有沒有辦法來定義這'constructFrom'功能?

回答

6

嵌入的比賽是有點冗長,並有一個小的維護麻煩與A.

的定義

保持同步下劃線的數量,您可以節省使用function關鍵字幾個按鍵。您也可以使用_作爲忽略所有內容的模式(這並不意味着您必須綁定到單個值)。

myList 
|> List.filter (function A _ -> true | _ -> false) 

在一般情況下,如果反覆寫爲上述功能,你應該定義一些active patterns,每一個案例:

let (|ACase|_|) = function 
    | A _ as x -> Some x 
    | _ -> None 

myList |> List.choose (|ACase|_|) 

有沒有一種方法來定義這個「constructedFrom」功能?

有沒有慣用的方式來做到這一點。我認爲積極模式可以在大部分時間內解決問題。

+0

感謝您的回覆。我可能會同時使用'function'關鍵字和'_'來忽略將來的所有參數。 –

4

您可以使用function而不是fun簡化您的List.filter中的matchfunction = fun x -> match x with

myList 
|> List.filter (function A(_,_) -> true | _ -> false) 

我不認爲有一種方式(或至少是一個良好的方式)來定義你的constructedFrom功能。

+0

感謝您的支持。在回答之前我不知道'功能'。 –

相關問題