对于我的函数编程作业我被指示编写一个函数,在列表中返回二次方程的真实解,我用判别式找出它们。
所以,我的代码看起来像这样:
quadSols::Double->Double->Double->[Double]
quadSols a b c = [x1,x2]
where
x1 = (-b - sqrt d) / (2 * a)
x2 = (-b + sqrt d) / (2 * a)
d = (b * b) - 4 * a * c
现在,问题是a = 0,解决方案只是x = -c / b。 我试过这样的事情,听起来完全错了,但我真的不知道该怎么做。
if a == 0 then quadSols a b c = [x]
然后添加到“where”部分:
x = -c / b
当试图用ghci加载它时我得到了:
parse error on input ‘=’
Failed, modules loaded: none.
有人可以给我一些指导吗?
答案 0 :(得分:2)
您可以简单地对a == 0
:
quadSols :: Double -> Double-> Double-> [Double]
quadSols 0 b c = [x]
where x = -c / b
quadSols a b c = [x1,x2]
where
x1 = (-b - sqrt d) / (2 * a)
x2 = (-b + sqrt d) / (2 * a)
d = (b * b) - 4 * a * c
请注意,必须在第二个案例之前包含第一个案例,因为案例按照宣布的顺序进行匹配。
答案 1 :(得分:2)
您可以向quadSols
添加另一个等式:
quadSols 0 b c = [x]
where
x = (-c) / b
quadSols a b c = [x1,x2]
where
…
或者使用警卫:
quadSols a b c
| a == 0 = [x]
| otherwise = [x1,x2]
where
x = (-c) / b
…
由于懒惰,除非产生结果,否则不会评估where
子句中的定义。