gpt4 book ai didi

haskell - 在什么情况下我们应该在类型声明中使用 `[ ] a`?

转载 作者:行者123 更新时间:2023-12-01 07:06:22 27 4
gpt4 key购买 nike

我只看到一个表情

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 pragma,您可以显式地将多态函数应用于类型参数,例如在 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

关于haskell - 在什么情况下我们应该在类型声明中使用 `[ ] a`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51255925/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com