📜  Haskell-Functor(1)

📅  最后修改于: 2023-12-03 15:15:28.651000             🧑  作者: Mango

Haskell-Functor

在 Haskell 中,Functor 是一个类型类,它定义了函数 fmap,它可以将一个函数应用于一个可容器化的类型中的每个元素,而不改变容器的形状。这使得我们能够编写通用的代码,可以处理不同类型的容器。

定义

一个 Functor 是一个将一个类型映射到另一个类型的函数,并保留了其可容器化行为的对象。它必须满足以下三个要求:

  1. 它应该对每个类型参数进行有效地映射。
  2. 它应该是无副作用的,即它不应该改变 container 中的任何值。
  3. 映射函数应该是指定的,即当应用相同的映射函数到相同的容器时,它应该总是产生相同的结果。

在 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 函数,把上一步的结果包装到列表中。最后,我们打印出结果。