所以我想计算国际象棋比赛的所有可能动作.当我计算它们时,我想将它们存储在一个特殊的数据结构中,因此很容易将所有的动作输出为表格的一个字符串(Stepts,Start,End)移动的一个例子是"2,1 -1,3-1"步长为2,我们从1-1到3-1.
为此,我创建了自定义数据类型,并希望在列表理解期间创建它们的多个实例,并同时构造不同的数据类型.到目前为止,我不确定,如何修复语法或在Haskell中是否可行.
到目前为止,我能够在列表推导中创建1个自定义数据类型,如下所示:
[ Position x y | x<- [1..5] , y<-[1..5]]
Run Code Online (Sandbox Code Playgroud)
但我想在一个列表理解期间创建多个位置,我认为它将是:
[ Position x y, Position x y | x<- [1..5] , y<-[1..5]]
Run Code Online (Sandbox Code Playgroud)
但结果是:
error: parse error on input ‘|’
Run Code Online (Sandbox Code Playgroud)
这是我定义自定义类型的方式:
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)
Run Code Online (Sandbox Code Playgroud)
最后我想做这样的事情:
[ Move(x, Position 1 1, Position x y ) | x<- [1..5] …Run Code Online (Sandbox Code Playgroud) 所以我只是抓住了Haskell,并坚持使用Do创建嵌套if-else语句的语法.我不确定,如果我应该使用多个Do或者如果我只用一个就可以完成所有操作.我也不确定是否应该使用return语句,如果所有分号都是必需的.
我尝试添加和删除大括号,返回语句,分号,不同的缩进,不知道还有什么要尝试.
我得到的错误如"•无法匹配预期类型'm0(m0 b0)'与实际类型'Int'•在'do'块的stmt中:a < - getVal"
这是我想要构建的那种结构,但它给了我错误.您可以将getVal函数想象为任意函数,它返回一个整数:
func :: Int -> Int
func val = do {
if val < 10
then do {
a <- getVal0;
b <- getVal1;
if (val+a+b) < 0
then return 1
else return 2}
else if val > 10
then do {
a <- getVal2;
b <- getVal3;
if (val + a +b) < 0
then return 0
else return 1}
else return 99; }
Run Code Online (Sandbox Code Playgroud)get val的一个例子是:
getVal :: Int
getVal = 5 …Run Code Online (Sandbox Code Playgroud) haskell ×2