Mar*_*ann 14

惯用F#根本没有空值,那么它有什么用?在F#中,模拟缺少值的最常用方法是使用option.

当我需要与可能返回的.NET代码进行互操作时null,我会尽快将其转换为选项,使用如下函数:

let toOption (x : obj) =
    match x with
    | null -> None
    | _ -> Some x
Run Code Online (Sandbox Code Playgroud)

只要你有你的价值建模为一个option,你可以用如撰写它Option.map,而有异曲同工之妙(但更好,更安全),比提议的C#运算符.

  • @Endrju在我的经验中,"以防万一"代码及其产生的思维导致了极其混乱和难以维护的代码.你没有听到Mark的核心观点:Nulls不是F#方式的一部分,你应该使用某种形式的ACL来获取空值,以防万一在你写之前检查洒水,*和'NullReferenceExceptions`*之外的等式你的真实代码 (4认同)
  • @Endrju如果从我的回答中看不出来的话,你问题的简短回答是:*no*,F#没有这样的算子.正如其他人所指出的那样,你可以提出这样一个特征,或者甚至可以贡献它,但我怀疑它是否会被接受......至少,我认为它不适合功能性思维.C#6现在获得此功能并没有改变这一点.事实上,当我第一次提出MVP审查时,我反对这个特殊的C#功能,因为它导致难以维护的代码,但我在批评中却相当孤独...... (4认同)
  • +1我称之为Option.ofObj :) (3认同)
  • 然后你有一个可怕的设计系统,你应该隐藏在*反腐败层*后面(见[DDD](http://amzn.to/WBCwx7)). (3认同)
  • @Endrju如果这些字段中的任何一个为空,你只想做什么,比如`?.`呢?你真的想要多久一次?在大多数情况下,你需要处理`SomeObject`为null的情况,`SomeComponent`为null且情况`SomeSubComponent`为null的情况不同,这很容易在'None`上进行模式匹配,但是迫使你回到容易出错的`if(abc == null)`在C#中.`?.'不够灵活,无法保证专用语言构建IMO. (2认同)

Rub*_*ink 4

在函数式语言中,条件/组合遍历,特别是在嵌套结构中,通常使用镜头的概念进行建模,这在 SO 线程中用一个简洁的示例进行了解释

在F#环境中,有Aether;请参阅介绍文章指南,该文章基于Mauricio Scheffer在FSharpx中开发和撰写的 Lenses 支持(此处) 。