首页 > 解决方案 > 为什么我们要在实例中定义函数?

问题描述

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。我们在实例中定义它有什么目的吗?

标签: haskelltypeclassfunctor

解决方案


我们为我们想要的任何类型定义一个Functortypeclass 的实例(这是有意义的),然后我们可以为任何这些类型使用同名函数“ fmap”。实际功能在每种情况下都会有所不同,instance具体取决于类型类(此处为Functor)的方法(此处只有一个方法,名为)的实际类型实现(又名“” fmap)。

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

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


推荐阅读