所以我想计算象棋这样的国际象棋的所有可能动作。在计算它们时,我想将它们存储在特殊的数据结构中,因此可以很容易地将所有动作以字符串形式输出(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]]
答案 0 :(得分:5)
您有两种可能:
返回职位列表列表:
[ [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]]
只需使用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]}