2016-07-14 8 views
1

多項式を表すtypeclassのshow関数の文字列表現を作成しようとしています。私は 'Char'から '[Char]'へのミスマッチの型エラーを受け取り続けますが、私の理解から、haskellの "append"関数はCharを文字列/ Charに連結することができます。私はどこに問題があるのか​​、私が受け取ったエラーに基づいて解決策を探すべきかを理解していません。ここに欠陥のあるコードがあります:エラー予想されるタイプ 'Char'と実際のタイプ '[Char]'を一致させることができませんでした。

newtype Poly a = P [a] 

instance (Num a, Show a) => Show (Poly a) where 
    show p = ["" : form (p !! i) i | i <- [l,(l-1)..0]] 
     where 
      l = length p 
      form e i 
       | i == 0 = elem 
       | i == 1 = elem ++ "x + " 
       | otherwise = elem ++ "x^" ++ (show i) ++ " + " 
        where elem = show e 

ご協力いただきありがとうございます。

+2

私はすでにいくつかの問題を見ることができますが、あなたは本当に 'ポリ'の定義を掲示すべきです。 – dfeuer

+0

また、小さなものから始めて、あなたのやり方で作業してください。 'form'関数を(' where'節ではなく)最上位に書くことができますか?これを済ませれば、少しだけビルドすることができます... – dfeuer

答えて

5

あなたは、文字列/ [シャア]にチャーを連結することができるはず私の理解のHaskellの「追加」機能から

を書きます。

このアイデアはどこにあるのかわかりません。それは間違っています。私はあなたが定義したと推測しています

type Poly a = [a] 

と私はその仮定に行きます。

instance (Num a, Show a) => Show (Poly a) where 

これは間違っています。 Polyの同義語です。インスタンスを宣言できるのは、適切なファーストクラスの型(型コンストラクタをゼロまたは複数の型変数に適用する)のためだけです。あなたは

newtype Poly a = Poly {getPoly :: [a]} 

、代わりに、使用することによってこの問題を解決することができますが、あなたは、必要に応じて Polyデータコンストラクタをアンラップ/ラップする必要があります。この権利を取得したら、あなたが与えた Numの制約は不要であることが分かります。

show p = ["" ++ form (p !! i) i | i <- [(length p)..0]] 

いくつかの問題があります。大きなことは、これは文字列(文字のリスト)を定義するのではなく、文字列のリストを定義するということです。一般的にはconcatを適用して修正できます。もう1つは"" ++ anythingがただanythingであることです。なぜなら、空のリストを別のリストに連結することは何もしないからです。 3番目の問題は、カウントダウンしようとしていることですが、間違ってしまっています。その表記はカウントアップするだけです。

let lp = length p in [lp, (lp-1) .. 0] 

私は(これらのミスのいくつかは、前二行に繰り返されます)すぐにご覧最後の事:

| otherwise = e ++ "x^" ++ i ++ " + " 

を今すぐカウントダウンするには、あなたがカウントダウンすることを示さなければなりませんiIntであり、++はリストに対してのみ機能します。それはうまくいきません。最初にishowを使用して文字列に変換する必要があります。 eはタイプaであり、showも使用して文字列に変換する必要があります。

+0

私はこの課題で作業を完了しようとしています:http://www.seas.upenn.edu/~cis194/hw/04-typeclasses。pdf、これは 'newtype Poly a = P [a]'で始まります。これを最初に追加します。フォーム部分が動作するようになりました。これで、理解がすべて一緒になります。あなたのご意見ありがとうございました。 –

+0

変更を表すコードも編集します –

関連する問題