Haskell中数据类型的笛卡尔积

Dan*_*nny 1 haskell list-comprehension cartesian-product

试图将两种数据类型的笛卡尔积产品放入一个列表中:

 data X = hello | goodbye | hi 
      deriving (ord, enum, eq, show)
 data Y = hello | goodbye | hi 
      deriving (ord, enum, eq, show)

 compList :: [a]
 compList = [(x, y) | x <- X, y <- Y]
Run Code Online (Sandbox Code Playgroud)

显然x < - X等目前不起作用,我只是想知道你们怎么会这样做?

干杯.

Car*_*ten 6

除了套管问题,你不能在这里有两个同名的数据构造函数,我认为最简单的方法是包含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]]
Run Code Online (Sandbox Code Playgroud)

使用Enum你可以使用[a .. b]语法(你可能已经知道)并Bounded给你minBoundmaxBound


产量

?> compList
[(Hello,Hello2),(Hello,Goodbye2),(Hello,Hi2),(Goodbye,Hello2),(Goodbye,Goodbye2),(Goodbye,Hi2),(Hi,Hello2),(Hi,Goodbye2),(Hi,Hi2)]
Run Code Online (Sandbox Code Playgroud)

当然,如果你不想使用,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]]
Run Code Online (Sandbox Code Playgroud)

当然这里几乎和说[Hello,Goodbye,Hi];)