如何使用列表理解来创建多个/不同的自定义类型?

时间:2019-02-05 08:43:50

标签: haskell

所以我想计算象棋这样的国际象棋的所有可能动作。在计算它们时,我想将它们存储在特殊的数据结构中,因此可以很容易地将所有动作以字符串形式输出(Stepts,Start,End) 一个举动的例子是“ 2,1-1,3-1”,步长为2时,我们从1-1跳到3-1。

为此,我创建了自定义数据类型,并希望在列表理解期间创建它们的多个实例,并同时构造不同的数据类型。 到目前为止,我不确定如何修复语法,甚至在Haskell中是否可以解决。

到目前为止,我已经能够在列表理解中创建1种自定义数据类型,如下所示:

    [ Position  x y | x<- [1..5] , y<-[1..5]] 

但是我想在一次列表理解中创建多个职位,我想是这样的:

    [ Position  x y, Position x y | x<- [1..5] , y<-[1..5]] 

但是结果是:

    error: parse error on input ‘|’

这就是我定义自定义类型的方式:

    data Move = Move{  steps:: Int
                 , start:: Position
                 , end  :: Position
                 } deriving (Read, Show, Eq)

    data Position = Position{
                x_pos:: Int
                , y_pos  :: Int
                } deriving (Read, Show, Eq)

最后,我想做这样的事情:

    [ Move(x, Position  1 1, Position x y ) | x<- [1..5] , y<-[1..5]] 

2 个答案:

答案 0 :(得分:5)

您有两种可能:

  1. 返回职位列表列表:

    [ [Position  x y, Position x y] | x<- [1..5] , y<-[1..5]]
    

    ,然后您可以使用concat将它们合并为一个列表:

    concat [ [Position  x y, Position x y] | x<- [1..5] , y<-[1..5]]
    
  2. 只需使用do表示法即可:

    do
      x <- [1..5]
      y <- [1..5]
      [ Position 1 1, Position x y]
    

答案 1 :(得分:1)

AJFarmar使用do表示法提供的解决方案:

    do {x <- [1..5]; y <- [1..5]; [Position 1 1, Position x y]}