【发布时间】: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_list和map_maybe和map_either和map_IO等等?这就是我们使用类型类的原因。 -
好的。所以我们在不同类型的 Functor 中定义
fmap然后它可以用于所有的 Functor,不是吗? -
是的,思想是抽象的:写一个通用公式,然后在通用函数中使用,我们可以应用到具体情况。 Monad 就是一个例子。
-
是的,在 typeclass 实例中定义一个函数允许在任何需要该 typeclass 的函数中使用该类型。因此,在您的示例中,
Maybe可以从任何接受Functor作为参数的函数传递,并且可以从将其返回类型声明为Functor a的函数返回。