F#:将字符串选项转换为字符串的最短方法

F#: shortest way to convert a string option to a string

objective 是将来自一些类型良好的计算的 string option 转换为普通的 string,然后可以将其传递给 UI/printf/URL/other 只需要一个字符串而对选项类型一无所知的东西。 None 应该变成空字符串。

最明显的方法是对输入执行 matchif

input |> fun s -> fun s -> match s with | Some v -> v | _ -> ""

input |> fun s -> if s.IsSome then s.Value else ""

但是虽然仍然是一行,但它们仍然占据了相当多的行space。我希望找到最短的方法来做到这一点。

到目前为止我找到的最佳解决方案是 input |> Option.fold (+) ""

...这只是 input |> Option.fold (fun s t -> s + t) "".

的缩写版本

我怀疑这是我能得到的最短的方法,但我想知道是否有其他更短的方法可以让非功能性程序员更容易理解。

您还可以使用函数 defaultArg input "",在您的代码中使用前向管道的函数为:

input |> fun s -> defaultArg s ""

这是另一种写法,但没有 lambda:

input |> defaultArg <| ""

如果我们在 F# 核心中有一个参数翻转的版本会更好。我仍然认为这是最短的方式,无需在其他库或用户定义的函数中进行中继。

更新

现在在 F# 4.1 中 FSharp.Core 提供了 Option.defaultValue,它是相同的但参数翻转了,所以现在你可以简单地写:

Option.defaultValue "" input

哪个是管道转发友好的:

input |> Option.defaultValue ""

最明显的方法是自己编写一个函数来执行此操作,如果将其放在 Option 模块中,您甚至不会注意到它不是核心库的一部分:

module Option =
    let defaultTo defValue opt = 
        match opt with
        | Some x -> x
        | None -> defValue

然后像这样使用它:

input |> Option.defaultTo ""

NuGet 包 FSharpX.Extras 有 Option.getOrElse 可以很好地组合。

let x = stringOption |> Option.getOrElse ""