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返回值时的最佳做法是什么?
我不太确定问题是什么.如果你完成了你的例子:
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)
改用.