Haskell错误的作业

时间:2014-07-24 21:48:54

标签: haskell binary numbers addition subtraction

我一直在寻找错误。 Haskell抱怨“解析错误(可能是错误的缩进或括号不匹配)”。我找不到任何东西。有没有人可以帮助我?代码应该加上和减去二进制数。

binadd :: [Int] -> [Int] -> [Int]
binadd xs ys = revers (binadd'(reverse xs) (reverse ys) 0) 
                       where binadd' [] [] _         = []
                             binadd' (x:xs) (y:ys) u = (mod (x+y+u) : binadd' xs ys) (div(x+y+z)2)
                             binadd' _ _ _           = error "Listen verschieden lang"


binsub :: [Int] -> [Int] -> [Int]
binsub a b = binadd a (help b) 
                 where help list = binadd [000000001] ([kipp i | i <- list ])
                       kipp    1 = 0
                       kipp    0 = 1

1 个答案:

答案 0 :(得分:2)

缩进是这里出现的代码 错误的一件事。我怀疑你在你试图编译的原始文件中有标签,对吧?始终缩进空格,而不是制表符,这样更可靠。你可以复制&amp;粘贴代码,因为它出现在这里,没有问题。

坦率地说,代码还有很多其他问题。对于初学者,您reverse拼错了revers,并使用了z变量,这些变量未在任何地方定义(您的意思是div (x+y+u) 2)。然后你忘了写mod (x+y+u) 2中的2。顺便说一句,Haskellers通常会在中缀符号中编写divmod等函数:

                         ... = ((x+y+u)`mod`2 : binadd' xs ys) ((x+y+u)`div`2)

出于某种原因,这更容易读取IMO,也不会让你轻易忘记论点。

该行仍然不对:您有两个不相交的带括号的群组((x+y+u)`mod`2 : binadd' xs ys)((x+y+u)`div`2)。将两个封闭的表达式一个接一个地放在右边总是意味着第一个是函数,第二个是该函数的参数。但在这种情况下不是:((x+y+u)`mod`2 : ...)只能是一个列表,而不是一个函数。但是,binadd' xs ys仍然是一个功能,因为你再一次忘记了一个论点。那个论点是另一个paren-block:你想要binadd' xs ys ((x+y+u)`div`2)。如果你把头放在前面,你可以完全掉落外面的那些:

                         ... = ( (x+y+u)`mod`2 : binadd' xs ys ((x+y+u)`div`2) )
                             ≡ (x+y+u)`mod`2 : binadd' xs ys ((x+y+u)`div`2)

可能还有更多问题,但请亲自尝试找到它们!