我只是看到一个表情
fmap_List :: (a -> b) -> [] a -> [] b
-- "[] a" means "[a]", for types.
fmap_List f [] = []
fmap_List f (x:xs) = f x : fmap_List f xs
由于[] a
手段[a]
,为什么我们不把[a]
直接呢?我们应该使用一些特殊情况[] a
吗?
只是避免使用语法糖[a]
,以此来说明的f
类型参数fmap :: Functor f => (a -> b) -> f a -> f b
已被类型构造函数替换[]
,就像其他任何类型构造函数一样。
也就是说,你可以写类型[a]
的[] a
,当你想强调一个签名的多态在某些类型的构造函数,如关系fmap
:
fmap :: Functor f => (a -> b) -> f a -> f b
-- f = []
fmap_List :: (a -> b) -> [] a -> [] b
fmap_List = fmap
-- f = Maybe
fmap_Maybe :: (a -> b) -> Maybe a -> Maybe b
fmap_Maybe = fmap
或join
:
join :: Monad m => m ( m a) -> m a
join_List :: [] ([] a) -> [] a
这与=完全相同[[a]] -> [a]
,只是使m
=更清楚[]
。
[] a
是[]
应用于类型变量的类型构造函数a
。[] a
或[a]
有那种*
,该种由值居住类型,例如Int
,Char
,Maybe Int
,或Either String Int
。[]
有种类* -> *
,那种称取一个类型参数,并产生一个类型,结果类型,例如[]
,Maybe
,Identity
,或Either e
。
您可以定义见本,例如instance Monad []
,我们愿意给予构造 []
(种* -> *
)作为参数传递给Monad
(样(* -> *) -> Constraint
),而不是一个类型(一种*
与构造等取得)instance Monad ([] a)
。这就像使用Maybe
代替Maybe a
,Maybe Int
,Maybe String
,&C。
使用TypeApplications
编译指示,您可以显式地将多态函数应用于类型自变量,例如在GHCi中:
> :set -XTypeApplications
> :type fmap @[]
fmap @[] :: (a -> b) -> [a] -> [b]
> :type fmap @Maybe
fmap @Maybe :: (a -> b) -> Maybe a -> Maybe b
> :type fmap @[] @Int @Char
fmap @[] @Int @Char :: (Int -> Char) -> [Int] -> [Char]
> :type fmap @[] @_ @Bool
fmap @[] @_ @Bool :: (a -> Bool) -> [a] -> [Bool]
这对于弄清楚如何使用多态函数,或通过将类型专门化为(更多)具体实例来记录使用该函数的容器或monad很有用:
> :type traverse
traverse :: (Traversable t, Applicative f) => (a -> f b) -> t a -> f (t b)
> :type traverse @[] @IO
traverse @[] @IO :: (a -> IO b) -> [a] -> IO [b]
您也可以要求GHCi提供一种类型,以更好地了解各种类型:
> :kind Either
Either :: * -> * -> *
> :kind Either String
Either String :: * -> *
> :kind Either String Int
Either String Int :: *
> :kind []
[] :: * -> *
> :kind [] Int
[] Int :: *
> :kind [Int]
[Int] :: *
> :kind Functor
Functor :: (* -> *) -> Constraint
> :kind Num
Num :: * -> Constraint
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句