如何创建列表解析多个/不同的自定义类型?

问题描述 投票:3回答:2

所以,我要计算所有像游戏棋可能的行动。虽然我算他们的,我想将它们存储在一个特殊的数据结构,所以它会很容易输出的种种举动的形式(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]] 
haskell
2个回答
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
投票

通过做记号AJFarmar提供的解决方案:

    do {x <- [1..5]; y <- [1..5]; [Position 1 1, Position x y]}
© www.soinside.com 2019 - 2024. All rights reserved.