Я не совсем уверен, в чем вопрос.Если вы завершите свой пример:
open System.Collections.Generic
let myfunc alist =
try
List.find (fun x -> true) alist
with
| :? KeyNotFoundException as ex -> null
, вы обнаружите, что он компилируется просто отлично, а выводимый тип myfunc : 'a list -> 'a when 'a : null
указывает, что тип, сохраненный в передаваемом вами списке, должен иметь null
правильное значение.F # прекрасно справляется с нулевыми значениями при использовании типов, определенных в C #, VB.NET и т. Д.
Однако, когда вы не взаимодействуете с кодом, написанным на другом языке .NET, типичный подход будетвернуть 'a option
, чтобы указать, что значение может присутствовать или не присутствовать.Тогда вашим примером станет:
let myfunc alist =
try
List.find (fun x -> true) alist
|> Some
with
| :? KeyNotFoundException as ex -> None
, который будет работать со списками, содержащими любой тип (даже те, которые не имеют нулевого значения в качестве правильного значения).Конечно, в этом случае вы можете просто использовать List.tryFind (fun _ -> true)
.