1

Polynomes を最初に長さ (度) で、2 番目に係数で比較して順序付けできるようにしたいと考えています。多項式は、 を含む double のリストです[1,2,3] = 3x²+2x+1。しかし、最後の要素としてゼロがある場合は削除する必要があるため、それを実行する という関数を作成しましたrealPolynomrealPolynom [1,2,3,0] = [1,2,3] これで、Ord インスタンスは次のようになります。

instance Ord Polynom where                                  
    compare a b = compare ((realLength a), reverse (pol2list (realPolynom a))) ((realLength b), reverse (pol2list (realPolynom b)))

realLength最後にゼロなしの多項式の長さです。

pLength :: Polynom -> Int       
pLength (Polynom(a)) = length a

realLength :: Polynom -> Int                        
realLength a = pLength(realPolynom(a))

pol2listPolynom p = p

pol2list :: Polynom -> [Double]
pol2list (Polynom p) = p 

問題は次のとおりです。

  • [0,2,0] < [0,2,3]確かに、それは良いことです

  • [0,2,0] < [0,2]偽、また良い

  • [0,2,0] > [0,2]偽、また良い

  • [0,2,0] == [0,2]false です。これは良くありません。等しいはずです!

4

3 に答える 3

7

Eqを導出する代わりに、おそらく次のように書く必要があります

instance Eq Polynom where
  a == b = compare a b == EQ
于 2014-05-19T12:52:12.227 に答える
4

最善の解決策は、最初から先行ゼロが表示されないようにすることです。つまり、リストから多項式を手動で構築する代わりに、Polynomeデータ型をパックする前にゼロを削除する「スマート コンストラクター」にそれらをフィードします。

オブジェクト指向のように見えるかもしれませんが、関数型言語であっても、この種のカプセル化が適切な場合があります。

于 2014-05-19T12:58:36.550 に答える
0

このようなものが動作するはずです:

instance Eq Polynom where
    x == y = pol2list (realPolynom x) == pol2list (realPolynom y)

残念ながら、この場合、派生Eqインスタンスは意図したものではありません。

于 2014-05-19T12:52:39.377 に答える