如何使用Haskell编写更少的代码?

时间:2013-02-16 19:28:30

标签: haskell

我正在测试Python和Haskell的代码密度。所以我决定写一个程序来解决形式ax ^ 2 + bx + c = 0的方程,其中a<> 0。在Python中,这需要五行:

import cmath

def secondgrade(a,b,c):
     d=b**2-4*a*c
     return ((-b+cmath.sqrt(d))/2*a,(-b-cmath.sqrt(d))/2*a)

在Haskell中,它应该更简洁,更简洁,它花了我十二行:

import Data.Complex

csqrt :: Double->Complex Double
csqrt a = if a<0 then 0.0 :+ sqrt(abs(a)) else sqrt(a) :+ 0.0

secondgrade :: Double->Double->Double->(Complex Double,Complex Double)
secondgrade a b c = let d = b^2 - 4*a*c
                    denominator=2*a :+ 0
                    b'=(-b) :+ 0
                    solution1=b'+(csqrt d)
                    solution2=b'-(csqrt d)
                 in (solution1/denominator,solution2/denominator)

是否有任何解决方案,线路更少且可读性不会下降?

1 个答案:

答案 0 :(得分:4)

我认为你现在拥有的Haskell解决方案比你的python版本更好,更易读。您可以重写Haskell,以匹配python版本,如下所示:

import Data.Complex
secondgrade :: Double->Double->Double->(Complex Double,Complex Double)
secondgrade a b c = ((((-b) :+ 0)+(csqrt d))/(2*a :+ 0), (((-b) :+ 0)-(csqrt d))/(2*a :+ 0))
  where d = b^2 - 4*a*c
        csqrt a = if a<0 then 0.0 :+ sqrt(abs(a)) else sqrt(a) :+ 0.0

当然,减少代码中的行数似乎对我来说是二年级。好的代码很容易阅读,不需要破译。

希望这有帮助!

相关问题