是否无法创建此数据类型的Functor实例?

Ben*_*ach 1 haskell types functor fractions

我正在尝试将此数据类型设为以下实例Functor:

data Fraction = Frac Integer Integer deriving Show
Run Code Online (Sandbox Code Playgroud)

但是,像这样定义它将不起作用:

instance Functor Fraction where
  pure = Frac 1 1
  fmap f (Frac a b) = Frac (f a) (f b)
Run Code Online (Sandbox Code Playgroud)

想要这个功能,我希望数据是Functor的一个实例.但是,这是否违反了一些法律,因为参数Fraction总是两个Integers

我总是可以fmap自己写一下并避免Functor声明,但我正试图更熟悉这种语言,所以任何帮助都会受到赞赏!

dfl*_*str 8

是的,如果没有类型变量来为声明"省略",你就无法定义一个仿函数(或者更正式地说:必须为某种类型定义仿函数实例* -> *).签名fmapfmap :: (a -> b) -> f a -> f b,所以为了满足该合同,必须有可能选择任何类型ab功能.

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

data Fraction a = Frac a a deriving Show
Run Code Online (Sandbox Code Playgroud)

...或者您可以在Data.Ratio中使用现有数据类型的分数/有理数,这不会形成仿函数,因为没有人认为有这样的实例是有用的(无论如何你会用它做什么?) ,但至少你会使用一个完善的现有数据结构.