如何在Haskell中区分列表和整数? 换句话说,我需要一个函数,它返回True为3并返回false为[3] 谢谢
答案 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] = True
和isAList (2 :: Int) = False
。请注意isAList "asdf" = True
,因为字符串是字符列表。
如果你可以详细说明为什么你需要这个吗?..