Haskell - 用Guards定义函数

时间:2014-08-09 15:19:06

标签: function haskell 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 `='

1 个答案:

答案 0 :(得分:6)

您的直接问题主要是由缩进引起的。卫兵需要缩进与他们相关的定义。

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'。由于三个不同的原因,这是错误的。

  1. 单引号表示Char。 String的双引号。
  2. 您不能仅仅因为该String而将布尔值与String进行比较 碰巧说&#34;真&#34;。你不得不说== True
  3. 没有理由写bool == True,因为那是。{li> 与编写bool完全相同。
  4. 此外,abc(d,e)应该都是单独的参数,而不是单个元组。你失去了这种方式的所有优点。