If Something Is Not A List In Haskell

前端 未结 3 464
轻奢々
轻奢々 2020-12-20 23:35

How do i check if an object in Haskell is not a list? for instance i want to know if
let a = 55, a is a list or just a number?

相关标签:
3条回答
  • 2020-12-21 00:07

    There is ghci :t (:type) command for that:

    > let a = 55
    > :t a
    a :: Integer
    > let b = [1..5]
    > :t b
    b :: [Integer]
    

    Hence, a is just an Integer, b is a list of Integer.

    0 讨论(0)
  • 2020-12-21 00:13

    You don't check. You do.

    But really, what are you trying to do here?

    If you are trying to ensure your function can only be called with a list

    Haskell will make sure your function can only be called with a list. If you try to call your function with a non-list, this will cause a compile error.

    e.g.

    myFunction :: [a] -> String
    myFunction []  = "no elements!"
    myFunction [_] = "single element!"
    myFunction _   = "many elements!"
    

    then

    myFunction [42] -- >>> "single element!"
    myFunction 42   -- ERROR: not a list
    

    If you want your function to do something sensible whether it is called with a list or with something else

    Use a typeclass: write different versions of your function for when it is called with a list and for when it is called with other types (within reason); Haskell then ensures that the proper version of your function is called.

    e.g.

    class MyClass a
      where myFunction :: a -> String
    
    instance MyClass Int
      where myFunction 0 = "zero!"
            myFunction 1 = "one!"
            myFunction _ = "something!"
    
    instance MyClass a => MyClass [a]
      where myFunction []  = "no elements!"
            myFunction [x] = "only " ++ myFunction x
            myFunction _   = "many elements!"
    

    then

    myFunction [42] -- >>> "only something!"
    myFunction 42   -- >>> "something!"
    

    Often the list version of your function will want to call the non-list version of your function and combine the results in some way.

    Which is appropriate in your situation depends on exactly what you're trying to do. If a typeclass is appropriate, you may be able to reuse a standard typeclass.

    0 讨论(0)
  • 2020-12-21 00:14

    Haskell is a statically typed, i.e. you know at compile time whether an identifier denotes something of type [Int] or of Int.

    0 讨论(0)
提交回复
热议问题