1

このデータ型を次のインスタンスにしようとしていますFunctor

data Fraction = Frac Integer Integer deriving Show

ただし、このように定義しても機能しません。

instance Functor Fraction where
  pure = Frac 1 1
  fmap f (Frac a b) = Frac (f a) (f b)

この機能が必要であり、データをFunctorのインスタンスにすることをお勧めします。しかし、のパラメータFractionは常に2つであるため、これはいくつかの法則に違反しますIntegersか?

私はいつでも自分で書いfmapて宣言を避けることができましFunctorたが、私は言語にもっと慣れようとしているので、助けていただければ幸いです!

4

1 に答える 1

8

はい、宣言のために「除外」する型変数がなければ、ファンクターを定義することはできません(または、より正式には、ファンクターインスタンスはある種のものに対して定義する必要があります* -> *)。のシグニチャfmapfmap :: (a -> b) -> f a -> f bであるため、そのコントラクトを満たすには、任意のタイプab関数を選択できる必要があります。

もちろん、次のように再定義Fractionすることもできます。

data Fraction a = Frac a a deriving Show

...または、 Data.Ratioの分数/有理数に既存のデータ型を使用できます。これは、そのようなインスタンスを持つことが有用であると誰も考えていないため、関数を形成しません(とにかく、それを何に使用しますか?) 、しかし、少なくともその場合は、確立された既存のデータ構造を使用することになります。

于 2012-08-15T18:55:47.770 に答える