哈斯克尔:意想不到的';'可能是由于布局不好

时间:2013-11-05 21:36:10

标签: haskell syntax-error

我必须写一个简单的程序告诉我,有多少解有二次方程。我写道:

howManySolutions :: Float -> Float -> Float -> Int

howManySolutions a b c = if (b^2-(4*a*c)) > 0 then 2 else 
                         if (b^2-(4*a*c)) == 0 then 1
                         else -1

但在WinHugs中我收到语法错误:

  unexpected ´;' possibly due to bad layout

我可以在GHCi中打开我的程序,但它不允许我使用负数...我做错了什么?

3 个答案:

答案 0 :(得分:7)

我不确定winhugs问题,但我可以帮助你解决这个问题。

首先,有点缩进:

howManySolutions a b c = if (b^2-(4*a*c)) > 0
                         then 2
                         else 
                           if (b^2-(4*a*c)) == 0
                           then 1
                           else -1

现在,如果您尝试将howManySolutions -1 2 3输入ghci,则会获得No instance for (Num (Float -> Float -> Float -> Int)) arising from a use of '-'。基本上它将' - '解释为应用于1 2和3而不是仅将其应用于'1'的函数。

您需要做的只是输入howManySolutions (-1) 2 3

现在,如果我能给你一个提示,通常会处理这种模式的方式是这样的:

howManySolutions a b c
  | delta > 0 = 2
  | delta == 0 = 1
  | otherwise = -1
  where delta = b^2-4*a*c 

'|'符号(警卫)充当不同的'ifs',并且底部的'where'子句允许您定义delta一次以在警卫中重复使用多次。它更漂亮:D

答案 1 :(得分:1)

只使用正确的缩进

howManySolutions a b c = if (b^2-(4*a*c)) > 0 
                            then 2 
                            else if (b^2-(4*a*c)) == 0 
                                    then 1
                                    else (-1)

更为惯用的解决方案

sol a b c | d >  0 = 2          
          | d <  0 = 0          
          | d == 0 = 1          
          where d = b^2-(4*a*c) 

答案 2 :(得分:0)

对Haskell使用-1是一个坏主意。您可以改为使用Maybe a,例如:

howManySolutions :: Float -> Float -> Float -> Maybe Int
howManySolutions a b c = let delta = b^2-(4*a*c) in
             if delta > 0 
             then Just 2 
             else if delta == 0 
                  then Just 1
                  else Nothing