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?
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
.
You don't check. You do.
But really, what are you trying to do here?
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
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.
Haskell is a statically typed, i.e. you know at compile time whether an identifier
denotes something of type [Int]
or of Int
.