F# equivalent of `is` keyword in C#?

前端 未结 3 1588
心在旅途
心在旅途 2020-12-10 12:18

My first F# day. If I have this:

let cat = Animal()

Now how do I check at later stage if cat is Animal

相关标签:
3条回答
  • 2020-12-10 12:28

    I know I'm late. If you try to test the type of a collection in fsi with :? it will give an error, if the item types do not match. E.g.

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

    Wrapping in a function like Daniels is<'T> works.

    0 讨论(0)
  • 2020-12-10 12:38

    For demonstration only (don't define an is function):

    let is<'T> (x: obj) = x :? 'T
    
    type Animal() = class end
    type Cat() = inherit Animal()
    
    let cat = Cat()
    cat |> is<Animal> //true
    
    0 讨论(0)
  • 2020-12-10 12:49

    @ildjarn deserves the credit here for answering first, but I'm submitting the answer here so it can be accepted.

    The F# equivalent of the C# is keyword is :?. For example:

    let cat = Animal()
    if cat :? Animal then
        printfn "cat is an animal."
    else
        printfn "cat is not an animal."
    
    0 讨论(0)
提交回复
热议问题