gpt4 book ai didi

haskell - GHC 9 中的 `forall {..}`

转载 作者:行者123 更新时间:2023-12-04 18:11:01 26 4
gpt4 key购买 nike

这是 GHC 9 中的有效语法。{..} 的作用是什么?均值(与 (..) 此处 GHC 8.10 要求的不同)?

ign :: forall {f :: Type -> Type} {p}. Applicative f => p -> f ()
ign _ = pure ()

最佳答案

6.4.14.1. Inferred vs. specified type variables :

Since the 9.0.1 release, GHC permits labelling the user-written type or kind variables as inferred, in contrast to the default of specified. By writing the type variable binder in braces as {tyvar} or {tyvar :: kind}, the new variable will be classified as inferred, not specified.


  • ..指定 类型
  • {..}推断 类型
  • forall a.forall {a}.是 GHC 将通过统一自动实例化的不可见量词。
    const :: forall a b. a -> b -> a
    const a _ = a
    这意味着 const True EQ在没有用户帮助的情况下实例化 a ( @Bool ) 和 b ( @Ordering )。
    如果用户想要显式实例化它们,他们可以使用可见类型应用程序“覆盖它们的可见性”。这就是为什么他们是 指定 类型。 (虽然“specifi able ”可能是更准确的术语)
    >> :set -XTypeApplications
    >> :t const @Bool @Ordering True EQ
    const @Bool @Ordering True EQ :: Bool
    如果出于某种原因我们只想指定 b (不调用“蜗牛小队”: @_ ,嗯“ partial type signatures”),我们可以将 a 设为推断类型。然后第一种类型被丢弃
    const2 :: forall {a} b. a -> b -> a
    const2 a _ = a

    >> :t const2 @Ordering True EQ
    const2 @Ordering True EQ :: Bool
    对于您的示例,这意味着 ghc 必须推断 f 和 p 的类型。你不能写 ign @IO @Int .

    当你有一种多态性时,这变得更加有用。如果你定义
    -- MkApply @Type @[] @Int :: [Int] -> Apply @Type [] Int
    -- MkApply @_ @[] @Int :: [Int] -> Apply @Type [] Int
    type Apply :: forall (k :: Type). (k -> Type) -> (k -> Type)
    newtype Apply f a where
    MkApply :: forall (k :: Type) (f :: k -> Type) (a :: k). f a -> Apply @k f a
    在实例化 MkApply @Type @[] @Int 时必须指定种类 k但是 [] 都暗示了这种类型和 Int .您可能更喜欢将 k 标记为 MkApply 中的推断。所以你可以写 MkApply @[] @Int
    -- MkApply @[] @Int :: [Int] -> Apply @Type [] Int
    type Apply :: forall (k :: Type). (k -> Type) -> (k -> Type)
    newtype Apply f a where
    MkApply :: forall {k :: Type} (f :: k -> Type) (a :: k). f a -> Apply @k f a

    关于haskell - GHC 9 中的 `forall {..}`,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70978592/

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