也许和 Functor Class

在 Haskell 中,数据类型可以像函数一样具有参数。以 Maybe 类型为例。

Maybe 是一种非常有用的类型,它允许我们表示失败的概念或其可能性。换句话说,如果计算失败的可能性,我们在那里使用 Maybe 类型。Maybe 有点像其他类型的包装器,为它们提供了额外的功能。

它的实际声明非常简单。

Maybe a = Just a | Nothing

这说明了一个 Maybe 有两种形式,一种代表成功的 Just,另一种代表失败的 NothingJust 采用一个参数来确定 Maybe 的类型,Nothing 不采用任何参数。例如,值 Just "foo" 将具有 Maybe String 类型,这是一个包含附加 Maybe 功能的字符串类型。值 Nothing 的类型为 Maybe a,其中 a 可以是任何类型。

包装类型以提供额外功能的想法是非常有用的,并且不仅适用于 Maybe。其他示例包括 EitherIO 和列表类型,每个类型提供不同的功能。但是,所有这些包装器类型都有一些共同的操作和功能。其中最值得注意的是修改封装值的能力。

通常将这些类型视为可以在其中放置值的框。不同的框具有不同的值并执行不同的操作,但如果不能访问其中的内容,则没有任何框可用。

为了封装这个想法,Haskell 带有一个名为 Functor 的标准类型类。它的定义如下。

class Functor f where
  fmap :: (a -> b) -> f a -> f b

可以看出,该类具有两个参数的单个函数 fmap。第一个参数是从一种类型 a 到另一种类型 b 的函数。第二个参数是包含 a 类型值的仿函数(包装类型)。它返回一个包含 b 类型值的仿函数(包装类型)。

简单来说,fmap 采用函数并应用于仿函数内部的值。它是类型成为 Functor 类成员所必需的唯一函数,但它非常有用。在 ApplicativeMonad 类型类中可以找到在具有更多特定应用程序的仿函数上运行的函数。