2011-01-12 67 views
0

我一直在寫一些F#約6個月,我遇到了一些我無法解釋的行爲。下面有一些簡單的代碼。 (值的名稱已被改變,以保護無辜!)F# - 模式匹配區分工會時的奇怪行爲

我有一個使用記錄類型rec1和rec2定義的層次結構,也是可能的值CaseA和CaseB的dicriminated聯合類型。我正在調用一個採用du_rec選項類型的函數('mynewfunc')。這個函數在內部定義了一個處理層次結構的遞歸函數。

我開始通過傳遞None選項值來表示層次結構的根(實際上,這個函數是從文件中反序列化層次結構)來處理。

當我運行下面的代碼時,我點擊了「failwith」無效的父代「」行代碼。我無法理解這是爲什麼,因爲傳遞下來的None值應該匹配外部模式匹配的None情況。

如果我刪除了兩組註釋中的任何一個,代碼就可以工作。這是不是我的攪局者 - 我只是覺得有點不舒服,不知道爲什麼發生這種情況(我想我理解F#)

預先感謝任何答覆

詹姆斯

type rec2 = 
    { 
    name : string 
    child : rec1 option 
    } 
and rec1 = 
    { 
    name : string ; 
    child : rec2 option 
    } 
and du_rec = 
    | Case1 of rec1 
    | Case2 of rec2 


let mynewfunc (arg:du_rec option) = 
    let rec funca (parent:du_rec option) = 
     match parent with 
     | Some(node) -> 
      match node with 
      | Case2(nd) -> 
       printfn "hello" 
      (* | Case1(nd) -> 
       printfn "bye bye" *) 
      | _ -> 
       failwith "invalid parent" 
     | None -> 
       // printfn "case3" 
       () 
     funcb(None) 
    and funcb (parent: du_rec option) = 
     printfn "this made no difference" 
    let node = funca(arg) 
    () 

let rootAnnot = mynewfunc(None) 
+0

你不需要在du_rec中使用`和`。不知道這是否有幫助。 – gradbot 2011-01-12 17:26:08

+3

原始代碼有點不正確,並沒有編譯。我已經修復它,以便編譯。我也在我的機器上測試過它,它似乎工作正常。你能用F#和FSI版本號來描述你正在使用的環境(單聲道或許?)嗎? – Juliet 2011-01-12 17:40:44

回答

3

根據評論,這在調試器中是一個不好的體驗(突出顯示控制流程正在進行的地方)。該代碼符合你的期望。

(有許多的地方,F#編譯器可以改善其序列點生成到PDBS,改善調試體驗。我想我們會在以後的版本中看着這)