所以,我要计算所有像游戏棋可能的行动。虽然我算他们的,我想将它们存储在一个特殊的数据结构,所以它会很容易输出的种种举动的形式(Stepts,开始,结束)的字符串此举一个例子是“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]]
你有两种可能性:
[ [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]
通过做记号AJFarmar提供的解决方案:
do {x <- [1..5]; y <- [1..5]; [Position 1 1, Position x y]}