[解決済み] なぜStringを型クラスのインスタンスにできないのですか?
2023-04-19 08:32:31
質問
与えられた :
data Foo =
FooString String
…
class Fooable a where --(is this a good way to name this?)
toFoo :: a -> Foo
を作りたいのですが
String
のインスタンスにしたい。
Fooable
:
instance Fooable String where
toFoo = FooString
するとGHCは文句を言います。
Illegal instance declaration for `Fooable String'
(All instance types must be of the form (T t1 ... tn)
where T is not a synonym.
Use -XTypeSynonymInstances if you want to disable this.)
In the instance declaration for `Fooable String'
もし、代わりに
[Char]
:
instance Fooable [Char] where
toFoo = FooString
GHCが文句を言う。
Illegal instance declaration for `Fooable [Char]'
(All instance types must be of the form (T a1 ... an)
where a1 ... an are type *variables*,
and each type variable appears at most once in the instance head.
Use -XFlexibleInstances if you want to disable this.)
In the instance declaration for `Fooable [Char]'
質問 :
- なぜ String と型クラスのインスタンスを作れないのでしょうか?
- GHCは、もし私が余分なフラグを追加すれば、このことから逃れられるようにすることを望んでいるようです。これは良いアイデアでしょうか?
どのように解決するのですか?
これは
String
は単なる型のエイリアスで
[Char]
の型エイリアスで、これは単に型構成子
[]
を適用したものです。
Char
のような形になるので、これは
([] Char)
という形にはなりません。
(T a1 .. an)
というのは
Char
は型変数ではないからです。
この制限の理由は、インスタンスの重複を防ぐためです。例えば、あなたが
instance Fooable [Char]
を持っていて、後から誰かがやってきて
instance Fooable [a]
. これでコンパイラはどれを使いたかったのかわからなくなり、エラーになります。
を使うことで
-XFlexibleInstances
を使うことで、基本的にそのようなインスタンスを定義しないことをコンパイラに約束することになります。
何を達成しようとしているかによりますが、ラッパーを定義する方が良いかもしれません。
newtype Wrapper = Wrapper String
instance Fooable Wrapper where
...
関連
-
[解決済み] Haskellで "length "関数を使用しない場合のリストの長さ
-
[解決済み] haskellにおけるdrop関数 - リスト内包を用いた実装
-
[解決済み] 読んで学ぶべき良いHaskellのソース [終了しました]。
-
[解決済み】テンプレートHaskellで関連する型の同義語を取得する
-
[解決済み] Haskell における `mod` と `rem` の違い
-
[解決済み] リーダーモナドの目的は何ですか?
-
[解決済み] GHCでコンパイルした小さなHaskellプログラムを巨大なバイナリにする
-
[解決済み] リストからn番目の要素を得るには?
-
[解決済み] このフィボナッチ関数はどのようにメモされているのですか?
-
[解決済み] Haskellにおける孤児化したインスタンス
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】haskellでリストを逆順にする
-
[解決済み] haskellにおけるdrop関数 - リスト内包を用いた実装
-
[解決済み] Haskellでメモ化?
-
[解決済み] Haskellはガベージコレクタを必要としますか?
-
[解決済み] Haskellの初心者向けガイド?[終了しました]
-
[解決済み] Haskellの派生はどのように行われるのですか?
-
[解決済み] Haskellの合成演算子(.)とF#のパイプ転送演算子(|>)の比較
-
[解決済み] Haskell の現在のモジュールにインポートモジュールを追加してエクスポートする。
-
[解決済み] Haskellのストリクトネスポイントは何ですか?
-
[解決済み] このHaskellのコードはなぜ-Oをつけると遅くなるのですか?