F#中的空聚合运算符?

前端之家收集整理的这篇文章主要介绍了F#中的空聚合运算符?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
当与C#库进行交互时,我发现自己想要使用C#的空合并运算符,这两个运算符都是Nullable结构和引用类型.

有可能在F#中使用单个重载操作符来近似,这样可以在适当的情况下嵌套?

是的,使用这个SO答案“ Overload operator in F#”中发现的一些小黑客.

在编译时,对于使用(‘a Nullable,a) – > a或(‘a when’a:null,’a) – >的正确的重载’一个单一的运算符可以内联.甚至(‘a选项’a) – > ‘可以投入更多的灵活性.

为了提供更接近c#操作符的行为,我使默认参数’一个懒惰,所以它的源不被调用,除非原始值为空.

例:

let value = Something.PossiblyNullReturned()
            |?? lazy new SameType()

执行:

NullCoalesce.fs [Gist]:

//https://gist.github.com/jbtule/8477768#file-nullcoalesce-fs
type NullCoalesce =  
    static member Coalesce(a: 'a option,b: 'a Lazy) = match a with Some a -> a | _ -> b.Value
    static member Coalesce(a: 'a Nullable,b: 'a Lazy) = if a.HasValue then a.Value else b.Value
    static member Coalesce(a: 'a when 'a:null,b: 'a Lazy) = match a with null -> b.Value | _ -> a

let inline nullCoalesceHelper< ^t,^a,^b,^c when (^t or ^a) : (static member Coalesce : ^a * ^b -> ^c)> a b = 
                                            ((^t or ^a) : (static member Coalesce : ^a * ^b -> ^c) (a,b))

let inline (|??) a b = nullCoalesceHelper<NullCoalesce,_,_> a b

猜你在找的设计模式相关文章