If Something Is Not A List In Haskell

試著忘記壹切 提交于 2019-12-29 08:40:48

问题


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?


回答1:


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.




回答2:


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




回答3:


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.



来源:https://stackoverflow.com/questions/8463777/if-something-is-not-a-list-in-haskell

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!