📅  最后修改于: 2023-12-03 15:15:28.651000             🧑  作者: Mango
在 Haskell 中,Functor 是一个类型类,它定义了函数 fmap,它可以将一个函数应用于一个可容器化的类型中的每个元素,而不改变容器的形状。这使得我们能够编写通用的代码,可以处理不同类型的容器。
一个 Functor 是一个将一个类型映射到另一个类型的函数,并保留了其可容器化行为的对象。它必须满足以下三个要求:
在 Haskell 中,Functor 类型类定义了一个名为 fmap 的函数,这个函数可以将一个函数应用于一个容器中的每个元素。
class Functor f where
fmap :: (a -> b) -> f a -> f b
实例化该类型类的类型必须定义如何映射元素。
我们可以使用 Functor 编写通用的代码,可应用于不同的类型容器。例如,我们可以使用 Functor 编写一个将每个 Maybe 类型的元素应用于给定函数的函数:
maybeMap :: (a -> b) -> Maybe a -> Maybe b
maybeMap f (Just x) = Just (f x)
maybeMap _ Nothing = Nothing
或者,我们可以创建一个函数,将每个元素加倍:
double :: (Functor f, Num a) => f a -> f a
double = fmap (*2)
上述函数可以应用于任何 Functor 类型的值,而不用考虑它们的类型。
下面是一个可能的使用 Functor 的示例:
-- Create a list of Maybes
listOfMaybes = [Just 1, Nothing, Just 2]
-- Define a function to double a number
doubleNum x = 2 * x
-- Map the function over the list
doubledList = fmap (fmap doubleNum) listOfMaybes
-- Print the result
main = print doubledList
输出:
[Just 2,Nothing,Just 4]
在上述示例中,我们首先创建了一个包含三个元素(两个 Just 和一个 Nothing)的 Maybe 类型列表。接下来我们定义一个函数,它将一个数字加倍。然后,我们将 fmap 函数两次应用于 listOfMaybes,第一次为每个元素应用 fmap 函数,把 doubleNum 包装到一个 Maybe 类型中,第二次为整个列表应用 fmap 函数,把上一步的结果包装到列表中。最后,我们打印出结果。