【问题标题】:Working with Nullable<'T> in F#在 F# 中使用 Nullable<'T>
【发布时间】:2009-09-10 17:42:31
【问题描述】:

我想知道其他人在处理 F# 中的 Nullable 时有什么想法。我想在数据类型上使用 Nullable 以便序列化正常工作(即,不会将 F# 选项类型写入 XML)。但是,我不希望我的代码陷入直接处理 Nullable 的丑陋问题。有什么建议么?

是直接在 Nullable 上使用活动模式匹配更好,还是只是一个转换器来选择并使用 Some/None 匹配?

此外,我也很想听听以一种很好的方式处理可空引用的想法。如果我使用,说“字符串选项”,那么我最终会使用 F# 选项类型来包装东西。如果我不这样做,那么我将无法区分真正的可选字符串和不应为空的字符串。

.NET 4 是否有可能使用 Option 来提供帮助? (如果它是 BCL 的一部分,那么我们可能会看到对它的更好支持......)

【问题讨论】:

    标签: f# nullable


    【解决方案1】:

    作为选项的活动模式与模式匹配很好地配合,但似乎通过使用活动模式(即typeof??)你的代码会吃更多的滴答声。 基本问题是您将如何处理可空引用? 如果您的代码是长链计算,最好使用单子语法:

    type Maybe<'a> = (unit -> 'a option)
    
    let succeed x : Maybe<'a> = fun () -> Some(x)
    let fail : Maybe<'a> = fun () -> None
    let run (a: Maybe<'a>) = a()
    let bind p rest = match run p with None -> fail | Some r -> (rest r)
    let delay f = fun () -> run (f ())
    
    type MaybeBuilder() =
      member this.Return(x) = succeed x
      member this.Let(p,rest) = rest p
      member this.Bind(p,rest) = bind p rest
      member this.Delay(f) = delay f
    
    let maybe = new MaybeBuilder()
    
    let add (a:'a) (b:'a) =
      maybe {
        match TryGetNumericAssociation<'a>() with
        | Some v -> return (v.Add(a,b))
        | _ -> return! fail
      }
    
    let add3 (a:'a) (b:'a) (c:'a) =
      maybe {
        let! ab = add a b
        let! abc = add ab c
        return abc
      }
    
    > let r1 = add 1 2;;
    val r1 : (unit -> int option)
    > r1();;
    val it : int option = Some 3
    > let r2 = add "1" "2";;
    val r2 : (unit -> string option)
    > r2();;
    val it : string option = None
    > let r3 = add3 "one" "two" "three";;
    val r3 : (unit -> string option)
    > r3();;
    val it : string option = None
    

    【讨论】:

    • 为什么不直接为'a option类型定义计算表达式,而是为unit -&gt; a option`定义计算表达式?
    • @Dario,我不记得确切,但似乎我早先编写了该代码,同时尝试为某些类型编写加法器,并且我想及时拆分效果。当然,两个版本都可以写。
    猜你喜欢
    • 1970-01-01
    • 2010-10-15
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-12
    相关资源
    最近更新 更多