8

初心者の質問で申し訳ありませんが、これに関する有用な情報を見つけるのに苦労しました。私は「Learn You Haskell for Great Good」に取り組んでいて、派生キーワードを理解しようとしています。これは、Java の実装のように見えますが、カテゴリ理論などのためにクールな自動コード生成を使用していると思われます。次のような2ベクトルのデータ構造を宣言します

data R2 = R2 {x :: Double, y :: Double} deriving (Show)

次に、次のようなことに使用できます

show (R2 1.0 2.0)

今私がやりたいのは、ベクトルの加算とスカラーの乗算です。

(2.0 * (R2 1.0 2.0)) + (R2 3.0 4.0)

しかし、私がしようとすると

Prelude> data R2 = R2 { x :: Double, y :: Double} deriving (Num,Show)
     <interactive>:3:52:
     Can't make a derived instance of `Num R2':
         `Num' is not a derivable class
     In the data declaration for `R2'

コンパイラはプリミティブ型のデカルト積を表示する方法を見つけましたが、足し算は難しすぎますか? Num は派生するのに適切な型クラスではないのでしょうか? 独自の show 関数を作成する必要がなかったのと同じように、型クラスを派生させ、追加の作業なしで機能するコードを取得できる頻度はどれくらいでしょうか?

どうもありがとう、

ジョン

4

5 に答える 5

6

Javaの実装のように見えますが、おそらくクールな自動コード生成を備えている派生キーワードを理解しようとしています

instanceimplementsは、型が型クラスのインスタンスであると述べてから実装を記述するという点で、もう少し に似ています。derivingこれらの実装のクールな自動生成がすべてです (ただし、 subsume は行いますinstance)。

独自の show 関数を作成する必要がなかったのと同じように、型クラスを派生させ、追加の作業なしで機能するコードを取得できる頻度はどれくらいでしょうか?

アレクセイ・ロマノフの答えは、どのクラスがderiving機能するかをカバーしています。インスタンスを自動生成する別の方法もあります: genericsを使用します。鳥瞰図から、それは次のように機能します: ジェネリック型のインスタンスがどのように見えるかを記述し、次に、インスタンスを持ちたい任意の型に対して、派生Genericして空を追加します (つまり、実装はありません。自動的に生成されます)instance宣言。一部のライブラリは、すぐに使用できる汎用インスタンスaesonを提供します。もちろん、クラス用に独自のインスタンスを作成することもできます。binary

于 2015-08-10T09:32:09.003 に答える
5

https://downloads.haskell.org/~ghc/7.10.2/docs/html/users_guide/deriving.htmlを参照してください:

Haskell 98 では、派生節に表示される可能性のあるクラスは、標準クラスの Eq、Ord、Enum、Ix、Bounded、Read、および Show のみです。

GHC では、宣言用の 、 、 、 、および宣言用の任意のクラスを派生させることもできますGeneric(FunctorリンクDataTypeableFoldableページTraversabledataリストnewtypeされているように、関連する拡張機能を有効にした後)。

于 2015-08-10T09:18:29.370 に答える
5

Num クラスを派生できない理由の 1 つを次に示します。

data Vector = Vector Int Int

instance Num Vector where
    Vector a b + Vector c d = Vector (a + c) (b + d)
    Vector a b * Vector c d = Vector (a * c) (b * d)

data Complex = Complex Int Int

instance Num Complex where
    Complex a b + Complex c d = Complex (a + c) (b + d)
    Complex a b * Complex c d = Complex (a * c - b * d) (a * d + b * c)

両方とも、実際のプログラマーが定義したいと思うかもしれない実用的なインスタンスです。2 つのフィールドを持つ特定のデータ定義の場合、句Intはどのインスタンスを選択する必要がありますか?deriving

于 2015-08-10T09:26:26.767 に答える
4
于 2015-08-10T09:21:35.957 に答える