如果某事不是Haskell中的列表

Edd*_*man 5 haskell

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

dav*_*420 25

你不检查.你做.

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

如果您尝试确保只能使用列表调用您的函数

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

例如

myFunction :: [a] -> String
myFunction []  = "no elements!"
myFunction [_] = "single element!"
myFunction _   = "many elements!"
Run Code Online (Sandbox Code Playgroud)

然后

myFunction [42] -- >>> "single element!"
myFunction 42   -- ERROR: not a list
Run Code Online (Sandbox Code Playgroud)

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

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

例如

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!"
Run Code Online (Sandbox Code Playgroud)

然后

myFunction [42] -- >>> "only something!"
myFunction 42   -- >>> "something!"
Run Code Online (Sandbox Code Playgroud)

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

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


jmg*_*jmg 6

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