【问题标题】:F# equivalent of `is` keyword in C#?F#相当于C#中的`is`关键字?
【发布时间】:2013-05-21 18:48:53
【问题描述】:

我的第一个 F# 日。如果我有这个:

let cat = Animal()

现在我如何在后期检查catisAnimal

在 C# 中

bool b = cat is Animal;

在 F# 中?

【问题讨论】:

  • let b = cat :? Animal
  • @ildjarn 您应该将其添加为答案而不是评论,以便可以接受。
  • @Jack :在手机上,所以我无法给出完整的答案。随意。 :-]
  • @ildjarn 谢谢,我知道这与:? 有关,但语法不正确!
  • 您也可以对类型进行模式匹配。检查其他 SO 问题 [此处][1]。 [1]:stackoverflow.com/questions/16679503/…

标签: types f# keyword language-comparisons


【解决方案1】:

@ildjarn 值得称赞,因为我首先回答了这个问题,但我在这里提交了答案,所以它可以被接受。

C# is 关键字的 F# 等效项是 :?。例如:

let cat = Animal()
if cat :? Animal then
    printfn "cat is an animal."
else
    printfn "cat is not an animal."

【讨论】:

    【解决方案2】:

    仅用于演示(不要定义is 函数):

    let is<'T> (x: obj) = x :? 'T
    
    type Animal() = class end
    type Cat() = inherit Animal()
    
    let cat = Cat()
    cat |> is<Animal> //true
    

    【讨论】:

    • 丹尼尔,你能告诉我|&gt;是什么吗?为什么要在函数调用之前包含它?它有名字吗?
    • 称为正向管道算子。它将左边的操作数作为右边函数的最后一个参数。 (see MSDN)
    • Daniel,你为什么不把 is 定义为一个函数,看起来对我很有用?
    • @sacha:鉴于有一个内置的类型测试运算符 (:?),is&lt;'T&gt; 没有提供太多价值。比较 cat is&lt;Animal&gt;cat :? Animal
    • 你是对的。它需要翻译,即将:? 读为“是”——与将&gt; 读为“大于”非常相似。
    【解决方案3】:

    我知道我迟到了。如果您尝试在 fsi 中使用 :? 测试集合的类型? 如果项目类型不匹配,它将给出错误。例如

    let squares = seq { for x in 1 .. 15 -> x * x }  
    squares :? list<int> ;;   // will give false  
    squares :? list<string> ;; // error FS0193: Type constraint mismatch
    

    像 Daniels 这样的函数包装是 有效的。

    【讨论】:

      猜你喜欢
      • 2013-10-08
      • 2010-12-10
      • 2011-05-08
      • 2010-10-01
      • 1970-01-01
      • 2016-06-21
      • 1970-01-01
      • 1970-01-01
      • 2011-11-01
      相关资源
      最近更新 更多