OCaml給出function `A -> 1 | _ -> 0
類型[> `A] -> int
,但爲什麼不是[> ] -> int
?OCaml函數的多態變體不夠多態嗎?
這是我的推理:
function `B -> 0
具有類型[<`B] -> int
。添加一個`A -> 0
分支,使其function `A -> 1 | `B -> 0
鬆開到[<`A|`B] -> int
。該函數在它可以接受的參數類型中變得更寬容。這是有道理的。function _ -> 0
有型號'a -> int
。這種類型可以與[> ] -> int
一致,而[> ]
是一個已經開放的類型(非常寬容)。添加`A -> 0
分支使其function `A -> 1 | _ -> 0
限制的類型爲[>`A] -> int
。這對我來說沒有意義。事實上,增加另一個分支`C -> 1
將使它[>`A|`C] -> int
,進一步限制類型。爲什麼?
注:我不是在尋找解決方法,我只是想知道這種行爲背後的邏輯。
在相關說明中,function `A -> `A | x -> x
的類型爲([>`A] as 'a) -> 'a
,雖然這也是該參數的限制性開放類型,但我可以理解其原因。該類型應與'a -> 'a
,[>` ] -> 'b
,'c -> [>`A]
;唯一的做法似乎是([>`A] as 'a) -> 'a
。
它對我的第一個例子是否存在類似的原因?
很好的理由,謝謝。但是作爲「錄製」的副作用,這仍然會導致像「'(function'A - > 1 | _ - > 0)」((fun x - >(match B with'B - >()) ; x)'B)''無法進行類型檢查。可能有更深的原因?在接受你的答案之前,我會再等一等。 –
你會提出什麼類型的'函數'A k - > k | _ - > 0''? –
gariguejej回答如下。 –