1

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

4

2 回答 2

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
于 2013-04-13T06:03:59.930 回答
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因为字符串是字符列表。

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

于 2013-04-13T06:03:49.410 回答