我正在为正在进行的跳棋游戏进行模拟。我开发了一个名为onemove的函数:
onemove :: (Int,[Char],[[Char]],(Int,Int)) -> (Int,[Char],[[Char]])
此函数将元组作为输入并返回已修改信息的元组。我已经按如下方式定义了输入变量:
onemove (a,b,c,(d,e))
其中c是字符列表,即捕获的片段。我目前正在使用警卫和where子句来完成从“d'到了'。如果可能的话,如何将元素附加到where子句中的列表b?我的示例代码如下:
onemove :: (Int,[Char],[[Char]],(Int,Int)) -> (Int,[Char],[[Char]])
onemove (a,b,c,(d,e))
| e <= 0 =(a-30,b,c)
| (posFrom == 'r') && (posTo == '-') && ( leftOrRight == 9) = (a-15,b,removeWRightMan)
| otherwise = (10000,b,c)
where posFrom = getPos d c
rightWGuy = d+4
b ++ rightWGuy
removeWRightMan = setPos rightWGuy sFPosTo '-'
值rightWGuy是一个Int,我试图将它传递给[char] ..这是否需要转换为char,然后才能附加到列表b?感谢
答案 0 :(得分:1)
只需将rightWGuy
转换为[Char]
即可:
import Data.Char (intToDigit)
-- some other things
b ++ [(intToDigit rightWGuy)]
请注意,intToDigit
仅适用于[0..15]
范围内的输入!
或者,为简化起见,您也可以使用show
。 show
的另一个优点是它支持任何数字,而不仅仅是0到15。
b ++ (show rightWGuy)
通过澄清你的评论,你可能想要这样:
onemove :: (Int,[Char],[[Char]],(Int,Int)) -> (Int,[Char],[[Char]])
onemove (a,b,c,(d,e))
| e <= 0 =(a-30,b,c)
| (posFrom == 'r') && (posTo == '-') && ( leftOrRight == 9) = (a-15,x,removeWRightMan) -- instead of b use x now
| otherwise = (10000,b,c)
where
posFrom = getPos d c
rightWGuy = d+4
x = b ++ (show rightWGuy) -- x is now b ++ rightWGuy
removeWRightMan = setPos rightWGuy sFPosTo '-'
因为Haskell没有副作用,只需执行b ++ [(intToDigit rightWGuy)]
不更改b
,它就会产生一个新列表,这是连接的结果。这个结果我们现在存储在x
中,我们将在你的新元组中使用它。