我一直在寫一些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)
你不需要在du_rec中使用`和`。不知道這是否有幫助。 – gradbot 2011-01-12 17:26:08
原始代碼有點不正確,並沒有編譯。我已經修復它,以便編譯。我也在我的機器上測試過它,它似乎工作正常。你能用F#和FSI版本號來描述你正在使用的環境(單聲道或許?)嗎? – Juliet 2011-01-12 17:40:44