代码之家  ›  专栏  ›  技术社区  ›  user8314628

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

  •  -1
  • user8314628  · 技术社区  · 6 年前
    instance Functor Maybe where
      -- fmap :: (a -> b) -> Maybe a -> Maybe b
      fmap f Nothing = Nothing
      fmap f (Just item) = Just (f item)
    

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

    1 回复  |  直到 6 年前
        1
  •  1
  •   Will Ness Derri Leahy    6 年前

    我们定义了一个 Functor typeClass用于我们想要的任何类型(这很有意义),然后我们可以使用相同的命名函数” fmap “对于任何一种类型。根据实际类型的实现,实际函数在每种情况下都是不同的(aka“ instance “”类型类(此处, 函子 方法 (这里,只有一个方法,名为 FMAP )

    就像 + 因为整数和复数(和矩阵等)是两个不同的函数,所以 FMAP . "从概念上说“它是一样的,但实际上它在每种情况下所做的是不同的。

    如果我们在一个实例之外定义“fmap”,我们以后就不能为另一个类型重新定义它了——这个名称已经被采用了。只有类型类的方法才允许我们对各种相关但不同的类型使用相同的名称。