我必须写一个简单的程序告诉我,有多少解有二次方程。我写道:
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中打开我的程序,但它不允许我使用负数...我做错了什么?
答案 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