有些机构能否向我解释Functor的签名。
Prelude> :info Functor
class Functor (f :: * -> *) where
fmap :: (a -> b) -> f a -> f b
(<$) :: a -> f b -> f a
我不明白*
的含义。
答案 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)与另一个类型一起使用,并再次生成一个类型。