Haskell - 使用Guards列出附加

时间:2014-08-09 23:05:55

标签: list haskell

我正在为正在进行的跳棋游戏进行模拟。我开发了一个名为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?感谢

1 个答案:

答案 0 :(得分:1)

只需将rightWGuy转换为[Char]即可:

import Data.Char (intToDigit)

-- some other things
b ++ [(intToDigit rightWGuy)]

请注意,intToDigit仅适用于[0..15]范围内的输入!

或者,为简化起见,您也可以使用showshow的另一个优点是它支持任何数字,而不仅仅是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中,我们将在你的新元组中使用它。