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

ckl*_*oan 3 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]] 
Run Code Online (Sandbox Code Playgroud)

但我想在一个列表理解期间创建多个位置,我认为它将是:

    [ Position  x y, Position x y | x<- [1..5] , y<-[1..5]] 
Run Code Online (Sandbox Code Playgroud)

但结果是:

    error: parse error on input ‘|’
Run Code Online (Sandbox Code Playgroud)

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

    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)
Run Code Online (Sandbox Code Playgroud)

最后我想做这样的事情:

    [ Move(x, Position  1 1, Position x y ) | x<- [1..5] , y<-[1..5]] 
Run Code Online (Sandbox Code Playgroud)

Kar*_*ski 5

你有两种可能性:

  1. 返回职位列表清单:

    [ [Position  x y, Position x y] | x<- [1..5] , y<-[1..5]]
    
    Run Code Online (Sandbox Code Playgroud)

    然后你可以使用concat以下方法将它们合并到单个列表中

    concat [ [Position  x y, Position x y] | x<- [1..5] , y<-[1..5]]
    
    Run Code Online (Sandbox Code Playgroud)
  2. 只需使用do符号:

    do
      x <- [1..5]
      y <- [1..5]
      [ Position 1 1, Position x y]
    
    Run Code Online (Sandbox Code Playgroud)

  • 如果你已经在列表理解中,我发现`[v | ...,v < - e]`清洁比`concat [e | ...]`. (4认同)