gpt4 book ai didi

performance - 没有约束的 GADT(或存在)可以像无类型的普通 ADT 一样编译吗?

转载 作者:行者123 更新时间:2023-12-02 02:23:48 24 4
gpt4 key购买 nike

假设我有一些 ADT,比如

data Foo = Foo !Int
| Bar (Int->Int) Foo

现在说我想强加某种额外的类型安全,摆脱“魔数(Magic Number)类型”:
{-# LANGUAGE GADTs #-}

newtype Intey a = Intey { getIntey :: Int }

data Foo' a where
Foo :: !(Intey a) -> Foo' a
Bar :: (Intey a -> Intey b) -> Foo' a -> Foo' b

由于 b只是构造函数中的一个幻像参数,没有约束或其他任何东西,它基本上没有意义——除了类型检查器。因此它可以编译成与 Foo 相同的吗? ,没有任何性能等成本?

最佳答案

您需要查看核心以绝对确定,但总的来说:

  • newtype与底层类型相比,没有运行时成本。然而像 map getIntey仍然会无所事事地遍历列表。
  • 类型和类型参数本身在编译期间会被删除,因此也应该没有运行时成本——这是静态类型的优点之一。仅当您使用类型类时,才能传递运行时值。

  • 因此,在大多数情况下,您可以期待相同的性能,但您可能需要对容器(如列表)上的操作有点小心。

    如果您限制自己使用 GHC 7.8,那么新的 coerce功能也可以帮助解决这个问题。

    关于performance - 没有约束的 GADT(或存在)可以像无类型的普通 ADT 一样编译吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23079243/

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