为什么我们在实例中定义函数?

时间:2018-12-07 23:03:37

标签: haskell typeclass functor

instance Functor Maybe where
  -- fmap :: (a -> b) -> Maybe a -> Maybe b
  fmap f Nothing = Nothing
  fmap f (Just item) = Just (f item)

如果我们在实例外部定义fmap,我们仍然可以将其应用于Functor Maybe。我们在实例中定义它有什么目的?

1 个答案:

答案 0 :(得分:1)

我们为所需的任何类型(有意义)定义Functor类型类的实例,然后可以对所有这些类型使用相同名称的函数“ fmap”。根据类型类(此处为instance)的方法(此处为实际类型)的实际类型实现(又称为“ Functor”),实际函数在每种情况下都会有所不同。 ,只是一种方法,名为fmap)。

就像+一样,整数和复数(以及矩阵等)是两个不同的函数,fmap也是如此。 “从概念上讲”是相同的,但实际情况在每种情况下都是不同的。

如果我们在实例外部定义“ fmap”,我们以后就无法将其重新定义为另一种类型-名称将被使用。只有类型类的方法允许我们对相同但不同的相关操作使用相同的名称。