我有一个声明为的函数
let GetLength (value : option<string>) =
if value.IsSome then value.Value.Length else 0
Run Code Online (Sandbox Code Playgroud)
我有变量
let a : string = "tom"
Run Code Online (Sandbox Code Playgroud)
如何将a传递给GetLength函数?
Ste*_*ing 11
接受的答案不会编译,并产生......
GetLength Some a;;
Run Code Online (Sandbox Code Playgroud)
^^^^^^^^^^^^^^错误FS0003:此值不是函数,无法应用
F#认为您正在构建一个(GetLength Some)
应用于该值的函数a
.那是因为它是一种功能语言.
正确的形式是
GetLength (Some a);;
Run Code Online (Sandbox Code Playgroud)
你没有施展它.您需要使用Some
构造函数:
GetLength Some a
Run Code Online (Sandbox Code Playgroud)
括号的替代方法:
GetLength <| Some a
Run Code Online (Sandbox Code Playgroud)
我认为解决这个问题很重要:
当你在一条线上使用12个令牌得到完全相同的东西时,为什么有人会愿意输入超过3行的18个令牌呢?
编写代码不仅仅是简洁性 - 它还涉及可读性和可维护性.假设你需要处理的情况a
是null
.通过模式匹配,你可以从这个:
let GetLength (value : string option) =
match value with
| Some s -> s.Length
| _ -> 0
Run Code Online (Sandbox Code Playgroud)
对此:
let GetLength (value : string option) =
match value with
| Some s when s <> null -> s.Length
| _ -> 0
Run Code Online (Sandbox Code Playgroud)
对于F#程序员来说,意思是明确的.要修复您的实现,看起来像这样:
let GetLength (value : option<string>) =
if value.IsSome && value.Value <> null then value.Value.Length else 0
Run Code Online (Sandbox Code Playgroud)
结果可能是相同的,但我发现一眼就看出发生的事情并不容易.
如果模式匹配不会与您产生共鸣,那就没问题,但是随着逻辑的发展,简单情况下的额外"成本"通常会被多次补偿.
归档时间: |
|
查看次数: |
2844 次 |
最近记录: |