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

是的,如果没有类型变量来“省略”声明(或者更正式地说:必须为某种类型的东西定义函子实例* -> *),您就无法定义函子。fmapis的签名fmap :: (a -> b) -> f a -> f b,因此为了满足该契约,必须可以选择任何类型ab函数。

您当然可以重新定义Fraction为:

data Fraction a = Frac a a deriving Show

...或者您可以将现有数据类型用于Data.Ratio中的分数/有理数,它不会形成函子,因为没有人认为拥有这样的实例很有用(无论如何,您会用它做什么?) ,但至少那时您会使用完善的现有数据结构。

于 2012-08-15T18:55:47.770 回答