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]]
但是我想在一个列表理解期间创建多个位置,我会假设它是:
[ 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]
推荐阅读
- arrays - Gson toJson 转换 OutOfMemory(OOM)
- go - 如何在自定义控制器中强制对 SharedIndexInformer 进行完全重新同步
- c# - 将 DbContext 从 MVC .NET Core 应用程序共享/扩展到(Razor)类库
- xamarin.forms - 无法从 Xamarin 表单应用程序生成发布版本
- oracle - 引用在 plsql 中未正确终止
- java - 如何从用户输入中打印一个单词
- google-cloud-platform - Google 计算引擎无法通过 nat 代理使用外部 IP 访问
- laravel - Laravel 5.5 如果 url 具有某种结构,则不要使用路由
- java - 使用反应式 Java WebSocket 客户端订阅特定主题
- javascript - 画布上下文 putImageData:由于浏览器优化导致的数据丢失