我有一个声明为
的函数let GetLength (value : option<string>) =
if value.IsSome then value.Value.Length else 0
我有变量
let a : string = "tom"
如何将a传递给GetLength函数?
答案 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个令牌完全相同的事情 在一条线上?
编写代码不仅仅是简洁 - 它还涉及可读性和可维护性。假设您需要处理a
为null
的情况。通过模式匹配,你可以从中得到:
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