将List与整数Haskell区分开来

时间:2013-04-13 05:56:43

标签: haskell

如何在Haskell中区分列表和整数? 换句话说,我需要一个函数,它返回True为3并返回false为[3] 谢谢

2 个答案:

答案 0 :(得分:13)

使用sum数据类型,例如Either

f :: Either Int [a] -> Bool
f (Left _)  = True
f (Right _) = False

f (Left 3)    -- evaluates to True
f (Right [3]) -- evaluates to False
f (Left 4)    -- also evaluates to True, if you want to check for certain values 
              -- within each type you should handle them explicitly

答案 1 :(得分:11)

这个问题毫无意义,因为你通常知道一个值是什么类型,如果没有,你将很难弄清楚如何处理它。但是,可能在TemplateHaskell或其他地方使用,所以......

class IsAList a where
    isAList :: a -> Bool

instance IsAList Int where
    isAList = const False

instance IsAList [a] where
    isAList = const True

现在isAList [2] = TrueisAList (2 :: Int) = False。请注意isAList "asdf" = True,因为字符串是字符列表。

如果你可以详细说明为什么你需要这个吗?..