Haskell:需要了解Functor的签名

时间:2016-04-22 10:04:06

标签: haskell

有些机构能否向我解释Functor的签名。

Prelude> :info Functor
class Functor (f :: * -> *) where
  fmap :: (a -> b) -> f a -> f b
  (<$) :: a -> f b -> f a

我不明白*的含义。

1 个答案:

答案 0 :(得分:6)

*是Haskell用于kinds

的语法

在这种情况下,它意味着f具有更高的角色(想想类型级别的函数)

此处f采用一种类型(第一种*)并生成另一种类型(第二种*

你基本上可以忘记这一切,只需将其读作:

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

但它是一个很好的文档IMO,并且有相当多的类更复杂, kind-signature 非常有用 - 例如:

class MonadTrans (t :: (* -> *) -> * -> *) where
  lift :: Monad m => m a -> t m a
        -- Defined in `Control.Monad.Trans.Class'

这里t将一个类型构造函数本身(Monad)与另一个类型一起使用,并再次生成一个类型。