如何将“字符串”转换为“option <string>”</string>

时间:2009-06-03 23:53:12

标签: f#

我有一个声明为

的函数
let GetLength (value : option<string>) = 
    if value.IsSome then value.Value.Length else 0

我有变量

let a : string = "tom"

如何将a传递给GetLength函数?

4 个答案:

答案 0 :(得分:11)

接受的答案无法编译,并产生......

GetLength Some a;;

^^^^^^^^^^^^^^   错误FS0003:该值不是函数,无法应用

F#认为您正在构建一个函数(GetLength Some)以应用于值a。那是因为它是一种功能语言。

正确的表格是

GetLength (Some a);;

答案 1 :(得分:8)

你没有施展它。您需要使用Some构造函数:

GetLength Some a

答案 2 :(得分:5)

圆括号的替代词:

GetLength <| Some a

我认为解决这个问题非常重要:

  

为什么有人愿意输入18   你可以获得超过3行的代币   使用12个令牌完全相同的事情   在一条线上?

编写代码不仅仅是简洁 - 它还涉及可读性和可维护性。假设您需要处理anull的情况。通过模式匹配,你可以从中得到:

let GetLength (value : string option) =
    match value with
    | Some s -> s.Length
    | _ -> 0

对此:

let GetLength (value : string option) =
    match value with
    | Some s when s <> null -> s.Length
    | _ -> 0

对于F#程序员来说,意思很明确。要修复您的实现,请看起来像这样:

let GetLength (value : option<string>) = 
    if value.IsSome && value.Value <> null then value.Value.Length else 0

结果可能是相同的,但我发现一眼就看出发生的事情并不容易。

如果模式匹配不与你产生共鸣,那就没关系,但是随着逻辑的发展,简单情况下的额外“成本”通常会被多次补偿。

答案 3 :(得分:3)

要回答将'a转换为option<'a>的一般问题,如果您想安全地执行此操作而不将对象应用于Some构造函数,那么我只需要一个简单的函数会使用:

let to_option = function
  | null -> None
  | obj -> Some obj