3

a (任意の型: int、char...) を取り、ASCII コードに対応する回数複製された入力を持つリストを作成する関数を作成しようとしています。

私はこれを作成しました:

toList n = レプリケート (fromEnum n) n

cmdで関数を使用しようとすると、予想されるタイプintとcharが一致する可能性があると表示されますが、cmdで実際の値を使用して関数を直接使用すると、想定どおりに動作します。

つまり: toList 'a' --> エラーが発生する

replica (fromEnum 'a') 'a' --> 問題なく結果が得られます

モジュール Data.Char (ord) をロードしました

これを修正するにはどうすればよいですか? また、なぜこのようなことが起こるのでしょうか?

前もって感謝します :)

4

1 に答える 1

4

欠けているのは型宣言です。あなたはそれが任意の型を取ることができるようにしたいと言っていますが、本当に欲しいのはtoListのインスタンスである何かを取ることですEnum. GHCi でそれをいじってみるとlet toList n = replicate (fromEnum n) n、 GHCi は意味があると思われるいくつかのデフォルトを自動的に選択するため、できるようになりますが、GHC でモジュールをコンパイルするときは、型宣言がないと機能しません。あなたがしたい

toList :: (Enum a) => a -> [a]
toList n = replicate (fromEnum n) n

型シグネチャに が必要な理由は(Enum a) =>、型シグネチャ があるためです。したがって、任意の型だけではなく、 のインスタンスを持つ型だけが必要であることがわかります。fromEnum(Enum a) => a -> IntEnum

于 2013-09-28T16:07:19.550 に答える