【问题标题】:Why do we define functions in instance?为什么我们要在实例中定义函数?
【发布时间】:2018-12-07 23:03:36
【问题描述】:
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。我们在实例中定义它有什么目的吗?

【问题讨论】:

  • 类型类通常用于定义 ad hoc 多态性。所以你可以将各种类型定义为Functors,然后对所有这些类型使用fmap
  • 当我可以写fmap 和写简单的实例时,我为什么要写map_listmap_maybemap_eithermap_IO 等等?这就是我们使用类型类的原因。
  • 好的。所以我们在不同类型的 Functor 中定义fmap 然后它可以用于所有的 Functor,不是吗?
  • 是的,思想是抽象的:写一个通用公式,然后在通用函数中使用,我们可以应用到具体情况。 Monad 就是一个例子。
  • 是的,在 typeclass 实例中定义一个函数允许在任何需要该 typeclass 的函数中使用该类型。因此,在您的示例中,Maybe 可以从任何接受 Functor 作为参数的函数传递,并且可以从将其返回类型声明为 Functor a 的函数返回。

标签: haskell typeclass functor


【解决方案1】:

我们为我们想要的任何类型定义Functor 类型类的实例(这是有道理的),然后我们可以为任何这些类型使用同名函数“fmap”。根据类型类(此处为Functor)的方法(此处仅一种方法)的实际类型实现(又名“instance”),实际功能在每种情况下都会有所不同,命名为fmap)。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-02-17
    • 1970-01-01
    • 2018-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多