2

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

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 中打开我的程序,但它不允许我使用负数......我做错了什么?

4

3 回答 3

7

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

首先,有点缩进:

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 3ghci,你会得到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

于 2013-11-05T21:49:46.270 回答
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) 
于 2013-11-05T21:38:20.157 回答
0

使用-1对 Haskell 来说是个坏主意。您可以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
于 2013-11-06T11:11:50.823 回答