2016-04-19 11 views
-1

多項式のインスタンス、(coeffs、fromCoeffs、coeffsB、fromCoeffsBを実装したい)に、(PolyA a)と(PolyB a)を設定しようとしています。自分の関数が多項式のクラスには見えないというエラーメッセージが表示されるので、何が間違っているのかよく分かりません。助けてください?ハスケル型クラスのインスタンス化

class Polynomial p where 

--default implementations 
data PolyA a = Coeffs [a] 
      deriving (Show) 
data PolyB a = Const a | X (PolyB a) a 
      deriving (Show) 

--instances 
instance Polynomial (PolyA a) where 
    coeffs (Coeffs f)=f 
    fromCoeffs f= Coeffs f 

instance Polynomial (PolyB a) where 
coeffsB (Const f)= [f] 
coeffsB (X f a)= coeffsB f ++ [a] 
fromCoeffsB [] = error "Wrong Input!" 
fromCoeffsB [f]= Const f 
fromCoeffsB [email protected](_:t)= X (fromCoeffsB (init lis)) (last lis) 
+1

'class'宣言で関数を定義していません。 – user2407038

答えて

1

次のコードは、私のためにコンパイルされます。変更の

class Polynomial p where 
    coeffs :: p a -> [a] 
    fromCoeffs :: [a] -> p a 

--default implementations 
data PolyA a = Coeffs [a] 
      deriving (Show) 
data PolyB a = Const a | X (PolyB a) a 
      deriving (Show) 

--instances 
instance Polynomial PolyA where 
    coeffs (Coeffs f)=f 
    fromCoeffs f= Coeffs f 

instance Polynomial PolyB where 
coeffs (Const f)= [f] 
coeffs (X f a)= coeffs f ++ [a] 
fromCoeffs [] = error "Wrong Input!" 
fromCoeffs [f]= Const f 
fromCoeffs [email protected](_:t)= X (fromCoeffs (init lis)) (last lis) 

概要:

  • Polynomialクラス宣言にメソッドを追加します。
  • インスタンス宣言の型引数を削除します。
  • coeffsfromCoeffsBfromCoeffsどこでも変更してください。
  • 現時点では、PolyBは1つのスペースで宣言されています。
+0

ありがとうございます。コードは完全に正常に動作していますが、fromCoeffs [1,2,3,5]を実行しようとすると、次のエラーメッセージが表示されます。:176:1: 使用に起因する(Num a0)型変数 「は」の「A0」が曖昧 。注: インスタンス積分A =>民(GHC.Real.Ratio A) - 「GHC.Real」 インスタンスに定義:いくつかの潜在的なインスタンスが存在しますNum Integer - 'GHC.Num'に定義されています インスタンスNum 'GHC.Float'でダブル定義 ... plus 3 others 'print'の最初の引数、つまり 'it' – Vlad

+0

@Vlad 'fromCoeffs [1,2,3,5] :: PolyA Int'や' fromCoeffs [1,2,3、 5] :: PolyB Double'。 –

+0

OK、十分に公正です。そんなにありがとう!私はハスケルで1年間プログラムを作ったが、まだそれのすべての小さな側面を知らない。あなたの助けの仲間に感謝の負荷! – Vlad

関連する問題