在某些变量具有特定值时分配特殊情况?

时间:2016-11-04 21:40:45

标签: haskell functional-programming

对于我的函数编程作业我被指示编写一个函数,在列表中返回二次方程的真实解,我用判别式找出它们。

所以,我的代码看起来像这样:

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.

有人可以给我一些指导吗?

2 个答案:

答案 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子句中的定义。