首页 > 解决方案 > 如何使用列表理解创建多个/不同的自定义类型?

问题描述

所以我想计算像国际象棋游戏的所有可能动作。当我计算它们时,我想将它们存储在一个特殊的数据结构中,因此很容易将所有移动输出为形式的字符串 (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]] 

标签: haskell

解决方案


你有两种可能:

  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]
    

推荐阅读