0

我对 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 `='
4

1 回答 1

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. 单引号表示一个字符。字符串的双引号。
  2. 您不能仅仅因为该字符串碰巧说“真”而将布尔值与字符串进行比较。你不得不说== True
  3. 没有理由去写bool == True,因为这和写完全一样bool

此外,a, b, c, and(d,e)可能都应该是单独的参数,而不是单个元组。你失去了以这种方式进行柯里化的所有优势。

于 2014-08-09T15:29:32.950 回答