如何检查Haskell中的对象是否不是列表?比如我想知道是否
let a = 55
,a
是一个列表还是一个数字?
答案 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
只是Integer
,b
是Integer
的列表。