除了大小写问题以及这里不能有两个同名的数据构造函数之外,我认为最简单的方法是包含 Bounded 然后你几乎明白了:
data X = Hello | Goodbye | Hi
deriving (Enum, Bounded, Show)
data Y = Hello2 | Goodbye2 | Hi2
deriving (Enum, Bounded, Show)
compList :: [(X,Y)]
compList = [(x, y) | x <- [minBound..maxBound], y <- [minBound..maxBound]]
使用Enum,您可以使用[a .. b] 语法(您可能已经知道),Bounded 为您提供minBound 和maxBound
输出
λ> compList
[(Hello,Hello2),(Hello,Goodbye2),(Hello,Hi2),(Goodbye,Hello2),(Goodbye,Goodbye2),(Goodbye,Hi2),(Hi,Hello2),(Hi,Goodbye2),(Hi,Hi2)]
当然,如果您不想使用Bounded,您可以自己给出限制:
data X = Hello | Goodbye | Hi
deriving (Enum, Show)
data Y = Hello2 | Goodbye2 | Hi2
deriving (Enum, Show)
compList :: [(X,Y)]
compList = [(x, y) | x <- [Hello .. Hi], y <- [Hello2 .. Hi2]]
当然在这里这几乎和说[Hello,Goodbye,Hi]一样长;)