【问题标题】:Cartesian product of data types in HaskellHaskell中数据类型的笛卡尔积
【发布时间】:2016-02-15 05:38:01
【问题描述】:

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

 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]

显然 x

干杯。

【问题讨论】:

    标签: haskell list-comprehension cartesian-product


    【解决方案1】:

    除了大小写问题以及这里不能有两个同名的数据构造函数之外,我认为最简单的方法是包含 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 为您提供minBoundmaxBound


    输出

    λ> 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]一样长;)

    【讨论】:

      【解决方案2】:

      您可以派生枚举和有界。这允许您编写:

      data X = hello | goodbye | hi
        deriving (Show, Enum, Bounded)
      
      data Y = a | b | c
         deriving (Show, Enum, Bounded)
      
      allX :: [X]
      allX = [minBound..maxBound]
      
      allY :: [Y]
      allY = [minBound..maxBound]
      
      allXY = [ (x,y) | x <- allX, y <- allY ]
      

      【讨论】:

        猜你喜欢
        • 2011-09-18
        • 2012-04-24
        • 2019-08-26
        • 2016-05-07
        • 2018-04-17
        • 1970-01-01
        • 2012-12-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多