【问题标题】:F#: shortest way to convert a string option to a stringF#:将字符串选项转换为字符串的最短方法
【发布时间】:2016-09-11 13:05:26
【问题描述】:

目标是将来自某些类型良好的计算的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 ""

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

【问题讨论】:

标签: f# tostring


【解决方案1】:

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

input |> fun s -> defaultArg s ""

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

input |> defaultArg <| ""

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

更新

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

Option.defaultValue "" input

这对管道转发友好:

input |> Option.defaultValue ""

【讨论】:

  • defaultArg input ""?
  • @PetSerAl -- 是的,但是input 来自同一行的另一个计算,因此所有管道。
  • @PetSerAl 我认为这是使用该功能的明显方式,这就是我省略它的原因,但为了完整起见会添加它。
  • 我不鼓励以这种方式使用defaultArg - 它具有为可选参数提供默认值的既定含义,并且在该上下文之外使用它会引起混淆。
  • @scrwtp 是的,我同意,主要是因为这个名字有点不幸,它可以有一个更通用的名字。我仍然认为这是问题标题中的“最短路径”。
【解决方案2】:

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

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

然后像这样使用它:

input |> Option.defaultTo ""

【讨论】:

  • 这和defaultArg不完全一样,只是名字稍微好一点?为什么不将其定义为let defaultTo = defaultArg
  • 不完全是,它有翻转的参数,正如我之前所说的那样,对于这种情况更有意义。
【解决方案3】:

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

let x = stringOption |&gt; Option.getOrElse ""

【讨论】:

    【解决方案4】:

    目前我发现的最佳解决方案是input |&gt; Option.fold (+) ""

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

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

    【讨论】:

    • 这太神秘了。阅读您的代码的人(包括将来的您自己)不会知道发生了什么。
    • 它不仅神秘,而且由于空字符串是字符串连接的附加标识,它也只是偶然正确。如果你想使用fold,请改成Option.fold (fun _ x -&gt; x)
    • 我不会说这是一个意外——它真的是故意的!关于其他人现在或将来会或不会觉得神秘的话题,我宁愿不去那里——这对现在来说不是很神秘,我也不怀疑,以后会不会长成这样。不同的人觉得可读的东西不同。
    猜你喜欢
    • 2017-11-29
    • 2018-04-30
    • 2014-05-20
    • 2017-06-09
    • 2023-03-28
    • 2014-06-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多