私は単純なクラスAClass
を公開しており、オーバーライドできる公開メンバーf1
があります。 AClass
の新しいインスタンスを別のメンバーf2
と定義する方法は何ですか?AClass
のソースコードを複製するのは簡単ですか?以下玩具コード:新しいメンバーでクラスインスタンスをオーバーライドする
class AClass a where
f1 :: a -> Int
data Val = I Int
instance AClass Val where
f1 x = 0
-- the method below can't be added as it is not public member of AClass
-- f2:: a -> Float
-- f2 x = 0.0
私は周りを見回したが、私はそれを行う方法上の任意の明確な例を見つけられませんでした(すなわち、例として、私にはよく理解できた - 明瞭度は相対的です)。可能な方法は何ですか?クロージャー、新しいタイプの宣言など?上記のおもちゃコードで技術を説明すると便利です(ラッパーをInt
に置き換えるなど)data
宣言などを変更できますが、上記のコードでは不変なのはクラス宣言AClass
です。これは、クラスがすでにライブラリライターによって書かれていることを前提としているため、私はそれに触れません。最終結果はAClass
の特典を継承し、f2
のメンバーを追加する別のおもちゃコードでなければなりません。
もちろん、このようなオーバーライドクラスでは注意が必要です。しかし、それは可能なことと、それがどういうものかを知るのに役立ちます。
- 更新 -
以下の作業コード - いくつか欠けている部分があった - - 解決策を考え出すためのベンとmergeconflictの功績下記に記入:
class AClass a where
f1 :: a -> Int
class (AClass a) => BClass a where
f2 :: a -> Float
data Val = I Int
instance AClass Val where
f1 _ = 0
instance BClass Val where
f2 _ = 0.0
@ dave4420:この例で編集していただきありがとうございます。 – Ben
はい、AClassの操作をサポートするクラスで、f2は機能します。しかし、私があなたのアプローチを試してみると、AnotherClassの目に見えないメンバーではないというf1のエラーが出ます。 f1とf2の両方の実装はインスタンスに残されており、エラーがどこから来るのかが分かります。 – Sal
'class AClass a => AnotherClass a where ...'は 'AnotherClass'のインスタンスになる前に 'a'型が' AClass'のインスタンスでなければならないことを示します。あなたがそのような宣言をしていないならば、それはあなたの誤りでしょう。 – comingstorm