Dev*_*Dev 0 haskell function pattern-guards
我是Haskell的新手,正在进行模拟棋子的任务.我在确定有条件地检查表达式和更新元组值的正确方法时遇到了一些困难.我有一个名为getPos的函数,它将在板上的特定位置返回Char以确定其状态.
    onemove :: (Int,[Char],[[Char]],(Int,Int)) -> (Int,[Char],[[Char]])
    onemove     (a,b,c,(d,e)) 
       | e <= 0 =(a-30,b,c)
       | e > 50 =(a-30,b,c)
       | (((posTo == 'r') || (posTo == 'i')) &&((posFrom == 'w')||(posFrom == 'k'))) == 'true'  =(a-20,b,c)
       | (((posTo == 'w')||(posTo == 'k')) && ((posFrom == 'r') || (posFrom == 'i')))== 'true' =(a-20,b,c)
       | otherwise = (1000,b,c)
       where posFrom = getPos (d, c)
             posTo =  getPos (e,c)
使用函数在where子句中定义变量是否正确?我在最后一行收到以下错误:
    parse error on input `='
您的直接问题主要是由缩进引起的.卫兵需要缩进与他们相关的定义.
onemove :: (Int,[Char],[[Char]],(Int,Int)) -> (Int,[Char],[[Char]])
onemove     (a,b,c,(d,e)) 
  | e <= 0 =(a-30,b,c)
  | e > 50 =(a-30,b,c)
  | (((posTo == 'r') || (posTo == 'i')) &&((posFrom == 'w')||(posFrom == 'k'))) =(a-20,b,c)
  | (((posTo == 'w')||(posTo == 'k')) && ((posFrom == 'r') || (posFrom == 'i'))) =(a-20,b,c)
  | otherwise = (1000,b,c)
  where posFrom = getPos (d, c)
        posTo =  getPos (e,c)
请注意,我还删除了== 'true'原始代码.由于三个不同的原因,这是错误的.
== True.bool == True,因为这与写作完全一样bool.此外,a,b,c,和(d,e)也许应该都是独立的参数,而不是一个单一的元组.你失去了这种方式的所有优点.