-7

PythonとHaskellのコード密度をテストしています。そこで、ax ^ 2 + bx + c=0の形式の方程式を解くプログラムを書くことにしました。ここでa<>0です。Pythonでは、これには5行かかります。

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では、12行かかりました。

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)

行数が少なく、読みやすさを損なうことのないソリューションはありますか?

4

1 に答える 1

4

あなたが現在持っているHaskellソリューションは、Pythonバージョンよりも優れていて読みやすいと私は主張します. 次のように、Python のバージョンに一致するように Haskell のものを書き直すことができます。

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

もちろん、コードの行数を減らすことは、私には非常に二流に思えます。優れたコードは読みやすく、解読する必要はありません。

お役に立てれば!

于 2013-02-16T19:39:35.830 に答える