我有以下代碼:爲什麼在F#模式匹配中某些表達式中的泛型類型與obj相匹配?
type Message<'a> = | Message of 'a
let handleMessage message =
match box message with
| :? Message<_> -> printfn "Message"
| _ -> printfn "Not message"
let handleMessageEx message =
match box message with
| :? Message<int> -> printfn "Message"
| _ -> printfn "Not message"
handleMessage <| Message 1
handleMessage <| Message (1 :> obj)
handleMessageEx <| Message 1
在F#交互式輸出如下:
Not message
Message
Message
爲什麼第一條語句結果「沒有消息」?即當匹配裝箱值F#無法檢測到它是通用類型消息< _>並且除非我指定底層類型,否則它將其設置爲對象(因此在(消息1)上失敗匹配)。
不能很好地解釋,所以只是一個評論,但泛型類型不是一個真正的類型,所以不能成爲模式類型測試的目標。類型測試需要一個「具體」類型,所以通配符被可能的'obj'最普通的東西代替。你可以使函數本身也是通用的'handleMessage <'a>'',但是你需要把通用參數放在調用站點以使它工作'handleMessage<|消息1'(沒有你也會得到「Not message」) –
Sehnsucht
問題是obj並不是F#世界中最普通的東西,因爲它不會匹配具體的類型。我想知道爲什麼在消息<'a>的情況下F#不會離開'開放,可用於任何匹配。 –