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

时间:2016-09-11 13:05:26

标签: f# tostring

目标是将来自一些漂亮类型计算的string option转换为普通string,然后将其传递给UI / printf / URL /其他内容只想要一个字符串,对选项类型一无所知。 None应该成为空字符串。

显而易见的方法是在输入上执行matchif

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

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

虽然仍然是单线,但这些仍占据了相当多的线路空间。我希望找到最简单的方法。

4 个答案:

答案 0 :(得分:8)

您还可以使用代码中使用正向管道的函数defaultArg input ""

input |> fun s -> defaultArg s ""

这是另一种编写相同但没有lambda的方法:

input |> defaultArg <| ""

如果我们在F#核心中有一个翻转参数的版本会更好。我认为这是没有中继其他库或用户定义函数的最短路径。

<强>更新

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

Option.defaultValue "" input

这是前瞻性的:

input |> Option.defaultValue ""

答案 1 :(得分:6)

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

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

然后像这样使用它:

input |> Option.defaultTo ""

答案 2 :(得分:2)

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

let x = stringOption |> Option.getOrElse ""

答案 3 :(得分:1)

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

...这只是input |> Option.fold (fun s t -> s + t) ""的缩短版本。

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