2013-07-21 63 views
1

鑑於以下有效模式:F#部分作用模式匹配「規則永遠不會被匹配」

let (| HasMatch |) (x:string) = 
    if x.Contains("0") then Some() 
    else None;; 

而下面的模式匹配FUNC:

let testFn x = function 
    | HasMatch i -> printfn "%A" i 
    | _ -> printf "nope";; 

最後一行的通配符模式表示warning FS0026: This rule will never be matched

我看到的所有示例似乎都推斷部分活動模式必須返回Some('a)才能匹配,而那些返回的示例3210被通配符捕獲。錯誤似乎有所不同。

我在想什麼?

+1

你的描述部分作用的模式,但你試圖用一個單一的情況下,一個定義它。這裏有一些相當不錯的教程:http://hestia.typepad.com/flatlander/2010/07/f-pattern-matching-for-beginners-part-6-active-patterns.html底部的摘要描述了文章中詳細介紹的不同類型。 – 7sharp9

回答

3

我想你應該如下None情況下添加到活動模式聲明:

let (| HasMatch | _ |) (x:string) = 
    if x.Contains("0") then Some() 
    else None;; 

在您的一部開拓創新的例子,編譯器推斷出你真正想要返回Option型。在您的示例中運行printf時,如果匹配,您會看到它打印Some Null

而且,它是壞的返回Some(),你應該返回說Some(x)或類似

+0

是的,def忘了'| _ |' – Micah