如果某事不是Haskell中的列表

时间:2011-12-11 11:59:12

标签: haskell

如何检查Haskell中的对象是否不是列表?比如我想知道是否
let a = 55a是一个列表还是一个数字?

3 个答案:

答案 0 :(得分:25)

你不检查。你这样做。

但是真的,你想在这做什么?

如果您尝试确保只能使用列表

调用您的功能

Haskell将确保只能使用列表调用您的函数。如果您尝试使用非列表调用函数,则会导致编译错误。

e.g。

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

然后

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

如果你希望你的函数做一些合理的事情,无论是用列表调用还是用别的东西调用

使用类型类:编写函数的不同版本,以便在使用列表调用它时以及何时使用其他类型调用(在合理范围内);然后Haskell确保调用函数的正确版本。

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!"

然后

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

通常,您的函数的列表版本将要调用函数的非列表版本并以某种方式组合结果。

哪种情况适合您的情况取决于您正在尝试做什么。如果类型类适当,您可以重用标准类型类。

答案 1 :(得分:6)

Haskell是一个静态类型,即你在编译时知道identifier是表示[Int]类型还是Int类型。

答案 2 :(得分:4)

有ghci :t:type)命令:

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

因此,a只是IntegerbInteger的列表。