gpt4 book ai didi

具有与其 C 对应物相同的强制表示的 Haskell 类型?

转载 作者:行者123 更新时间:2023-12-04 12:21:17 24 4
gpt4 key购买 nike

如何确定 Haskell 类型在给定平台上是否具有等效的 Coercible 实例?

我刚刚被告知 Coercible 在 GHC 7.8 中,这看起来很棒。在这种情况下,我想解决我的具体问题的一个同样好的问题是:有没有办法询问 GHC 哪些类型对 a , b有一个Coercible a b例如(在当前平台上,比如说)?

在我看来,对于 coerce :: Coercible a b => a -> b 为了在与编译器和平台无关的程序中有用,需要知道——最好只在编译时,但也可能在编写代码时明确知道——给定的 Coercible a b实例存在于给定平台上,否则使用较慢的非 noop 回退(我猜是通过 CPP)。

追问: GHC提供功能是否有意义

coerceOrConvert :: (a -> b) -> a -> b

具有 coerceOrConvert f 的属性是
  • coerce如果有 Coercible a b当前 GHC 版本和平台的实例
  • f如果不是

  • 我意识到这对于普通类型类没有什么意义,但是 Coercible看起来很不寻常,所以我很难说……

    最佳答案

    通常在 Haskell 中处理的强制类型有两种:表示相等(通过 newtypeCoercible )和关于类型变量的新信息(通过 Typeable )。第二种类型与运行时表示关系不大,所以我只描述Coercible。/newtype机制。

    保证newtype仅更改类型信息而不更改底层表示,因此如果我们有(标准示例)

    newtype Age = Age { unAge :: Int }

    那么我们应该能够对类似的东西充满信心
    instance Num Age where
    Age a + Age b = Age (a + b)
    ...

    (+) 一样快在 Int是---即幕后没有指针间接进行。事实上,GHC 消除了 Age构造函数在这里没有任何困难。当我们想做类似的事情时,挑战就来了
    map Age :: [Int] -> [Age]

    自从 IntAge在结构上是相同的,这也应该是一个空操作——我们要做的就是在编译时满足类型系统,然后扔掉 map Age在运行时运行。可悲的是,自从 map 以来,情况并非如此。即使它在每个阶段什么都不做,它仍然会遍历我们的列表。

    在大量 newtype 的情况下s 被抛出,但我们也希望 GHC 生成您可能会看到(危险,小心)使用 unsafeCoerce 的最严格的编译代码
    unsafeCoerce :: [Int] -> [Age]

    在这种情况下 unsafeCoerce是“安全的”,因为我们知道这两种类型在运行时是相同的。此外,由于 unsafeCoerce纯粹在类型级别上运行,并且在运行时是真正的无操作,我们知道这与 map Age 不同。 , unsafeCoerce是真正的 O(0)强制。

    但这非常危险。
    Coercible希望通过允许像这样的实例化来解决这个问题
    instance Coercible a b => Coercible [a] [b] where coerce = unsafeCoerce

    因此 Haskell 类型类机器允许 coerce仅在安全时使用,不像 unsafeCoerce .为确保这种情况, Coercible 的恶意实例一定不可能出现。被 build 。为此所有 Coercible实例由编译器基于 newtype 的使用构建。 .

    最后一点,当你真正深入了解 Coercible作品你必须了解新的 Haskell 角色系统,它允许开发人员注释 newtype应该允许强制。这在 [ Coercible 的文档中] 有明确的概述。类] ( http://www.haskell.org/ghc/docs/7.8.1-rc2/html/libraries/base-4.7.0.0/Data-Coerce.html)。

    关于具有与其 C 对应物相同的强制表示的 Haskell 类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22459318/

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