也许和 Functor Class
在 Haskell 中,数据类型可以像函数一样具有参数。以 Maybe
类型为例。
Maybe
是一种非常有用的类型,它允许我们表示失败的概念或其可能性。换句话说,如果计算失败的可能性,我们在那里使用 Maybe
类型。Maybe
有点像其他类型的包装器,为它们提供了额外的功能。
它的实际声明非常简单。
Maybe a = Just a | Nothing
这说明了一个 Maybe
有两种形式,一种代表成功的 Just
,另一种代表失败的 Nothing
。Just
采用一个参数来确定 Maybe
的类型,Nothing
不采用任何参数。例如,值 Just "foo"
将具有 Maybe String
类型,这是一个包含附加 Maybe
功能的字符串类型。值 Nothing
的类型为 Maybe a
,其中 a
可以是任何类型。
包装类型以提供额外功能的想法是非常有用的,并且不仅适用于 Maybe
。其他示例包括 Either
,IO
和列表类型,每个类型提供不同的功能。但是,所有这些包装器类型都有一些共同的操作和功能。其中最值得注意的是修改封装值的能力。
通常将这些类型视为可以在其中放置值的框。不同的框具有不同的值并执行不同的操作,但如果不能访问其中的内容,则没有任何框可用。
为了封装这个想法,Haskell 带有一个名为 Functor
的标准类型类。它的定义如下。
class Functor f where
fmap :: (a -> b) -> f a -> f b
可以看出,该类具有两个参数的单个函数 fmap
。第一个参数是从一种类型 a
到另一种类型 b
的函数。第二个参数是包含 a
类型值的仿函数(包装类型)。它返回一个包含 b
类型值的仿函数(包装类型)。
简单来说,fmap
采用函数并应用于仿函数内部的值。它是类型成为 Functor
类成员所必需的唯一函数,但它非常有用。在 Applicative
和 Monad
类型类中可以找到在具有更多特定应用程序的仿函数上运行的函数。