处理F#中的空值

And*_*dry 0 .net null f# return-value

正如你所看到的大量问题所见,我真的越来越深入了解F#:)

另一个疑问接近我的学习路径:空值.考虑到由于.NET框架和F#(或框架中的任何其他语言)之间的紧密集成,如何处理它们?

为了简单起见,这里有一段代码:

let myfunc alist =
   try
      List.find (fun x -> true) alist
   with
      | :? KeyNotFoundException as ex -> (* should return null *)
Run Code Online (Sandbox Code Playgroud)

如何在函数中返回null?
null关键字是无用的,除非被识别(不相同nil).
而且,一般来说,处理null返回值时的最佳做法是什么?

kvb*_*kvb 6

我不太确定问题是什么.如果你完成了你的例子:

open System.Collections.Generic

let myfunc alist =
   try
      List.find (fun x -> true) alist
   with
      | :? KeyNotFoundException as ex -> null
Run Code Online (Sandbox Code Playgroud)

你会发现它编译得很好,而推断的类型myfunc : 'a list -> 'a when 'a : null表明存储在你传入的列表中的类型必须具有null适当的值.当使用C#,VB.NET等中定义的类型时,F#完全能够处理空值.

但是,当您不与使用其他.NET语言编写的代码进行互操作时,典型的方法是返回一个'a option指示值可能存在或不存在的值.然后,您的示例将变为:

let myfunc alist =
   try
      List.find (fun x -> true) alist
      |> Some
   with
      | :? KeyNotFoundException as ex -> None
Run Code Online (Sandbox Code Playgroud)

这将适用于包含任何类型的列表(甚至是那些没有null作为适当值的列表).当然,在这种情况下你可以List.tryFind (fun _ -> true)改用.

  • 我同意,但我认为`List.tryFind`值得更加突出.要求.NET框架生成调用堆栈并在每次找不到您要查找的内容时抛出异常并不是获得良好性能的方法.`let myfunc = List.tryFind(fun _ - > true)`是要走的路. (2认同)