Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/haskell/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Haskell 为什么我们要在实例中定义函数?_Haskell_Typeclass_Functor - Fatal编程技术网

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

Haskell 为什么我们要在实例中定义函数?,haskell,typeclass,functor,Haskell,Typeclass,Functor,如果我们在实例外部定义fmap,我们仍然可以将其应用于函子。我们在实例中定义它有什么意义吗?我们为我们想要的任何类型定义一个Functortypeclass的实例(这是有意义的),然后我们可以为这些类型中的任何一个使用相同的命名函数“fmap”。根据typeclass(此处为Functor)方法(此处为一个名为fmap)的实际类型实现(也称为“实例”),实际函数在每种情况下都会有所不同 就像整数和复数(以及矩阵等)的+是两个不同的函数一样,fmap也是如此。“概念上”是一样的,但在每种情况下,它

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

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

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


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

TypeClass通常用于定义特殊多态性。因此,您可以将各种类型定义为
Functor
s,然后对所有这些类型使用
fmap
。当我可以编写
fmap
并编写简单的实例时,为什么我要编写
map\u列表
map\u可能
map\u等?这就是为什么我们使用typeclasses.Ok。因此,我们在不同种类的函子中定义了
fmap
,然后它可以用于所有的函子,不是吗?是的,其思想是抽象的:编写一个通用公式,然后在一般函数中使用它,我们可以将其应用于特定的情况。Monad就是一个例子。是的,在typeclass实例中定义函数允许在任何需要该typeclass的函数中使用该类型。因此,在您的示例中,
可能
可以从任何接受
函子
作为参数的函数传递,也可以从声明其返回类型为
函子a
的函数返回。
instance Functor Maybe where
  -- fmap :: (a -> b) -> Maybe a -> Maybe b
  fmap f Nothing = Nothing
  fmap f (Just item) = Just (f item)