未确定的泛型类型在 ghci 的运行时中如何表示

2024-04-23

我很清楚通用函数和通用数据类型。

在泛型类型中:

data SB = forall x. (show x) => SB x
instance Show SB where
  show (SB x) = show x

所以对于任何给定类型x,如果它有一个签名Show,并且肯定有一个show函数与之对应。

但是当输入 ghci 时,例如

:t 1

outputs

1 :: Num a => a

如果绑定1到一个名字:

let a=1
:t a

now a有一个真实的类型。

问题是:

What is 1运行时系统中的形式(在它有类型之前,它只有Num),因为它只能保存一些可以转换成的信息。

是否有一些内部功能可以将通用“信息”“打包”成真实的东西?

据我现在所知,在 haskell 中,一些真实的东西应该有“通用”标签,但不应该有一些“纯通用的东西”。

Regards!

可能的结果:

reference to `1` becomes:
get_const_value_1 :: (Num a) => a
get_const_value_1 = fromIntegral (1 :: Integer)

正如 Don Stewart 所说,GHC 中的类型类是使用“字典”实现的。这意味着类型类Num被表示为函数的记录(我将跳过Eq and Show此处的限制):

class Num a where
    fromInteger :: Integer -> a
    ...

becomes

data Num a = Num { fromInteger :: Integer -> a, ... }

定义实例时,将使用该实例中的函数创建一条新记录:

instance Num Integer where
    fromInteger = id
    ...

becomes

numDictForInteger = Num { fromInteger = id, ... }

现在,当您在多态上下文中使用此函数时,编译器不知道要使用哪个字典,因此它会为其生成一个额外的参数:

foo :: Num a => a
foo = 1

becomes

foo :: Num a -> a
foo numDict = fromInteger numDict 1

注意如何约束Num a =>成为参数Num a ->.


但是,当您删除多态性时,编译器知道要静态使用哪个字典,因此它会继续内联它而不是生成参数:

foo :: Integer
foo = 1

becomes

foo :: Integer
foo = fromInteger numDictForInteger 1

作为脚注,这就是单态限制存在的原因。多态值不会是 CAF,因为它需要字典参数。这可能会导致性能特征与您预期的显着不同,因此您必须明确声明此行为是您想要的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

未确定的泛型类型在 ghci 的运行时中如何表示 的相关文章

随机推荐

  • C# - 使用 HTML Agility Pack 获取标签内的文本

    我使用以下代码来解析 HTML 文档并将其存储为 CSV 文件 string actuald null string data1 File ReadAllText E text html HtmlDocument doc new HtmlD
  • Android上字符串类型listview实现searchview

    我有一个清单items我想在此基础上开始不同的活动item 当我单击它时 它会打开正确的活动 但是当我尝试从搜索视图栏中搜索列表项时 它会打开错误的活动 listView ListView findViewById R id listVie
  • SWT 不再有句柄

    Windows XP 每个进程的用户句柄限制为 10000 个 每个桌面会话的用户句柄总数为 32000 个 但是 当我运行 4 或 5 个 SWT 进程 每个进程消耗不超过 2000 个用户句柄 时 总是会抛出 SWT No More h
  • Bootstrap v4 - 响应式文本

    如何在 Bootstrap v4 中使用响应式文本 我试过 include media breakpoint up sm resp text font size 16px include media breakpoint up lg res
  • 单击透明 xlib 窗口

    我有一个透明的 类似水印的应用程序 它是用 C 语言的 XLib 编写的 目前 如果您单击应用程序上的任何位置 什么也不会发生 但我希望它将鼠标输入传递到其下方的任何内容 例如如果您单击 X 关闭应用程序下方的窗口 它应该关闭应用程序 而不
  • 如何避免 git-apply 更改行结尾

    我有一个 git repo 设置core eol crlf core autocrlf true and core safecrlf true 当我应用另一个补丁时crlf存储库和我的存储库中受影响文件的所有行结尾都更改为lf 目前我正在应
  • 如何用tensorflow计算AUC?

    我已经使用 Tensorflow 构建了一个二元分类器 现在我想使用 AUC 和准确性来评估分类器 就准确性而言 我可以轻松地这样做 X tf placeholder float None n input y tf placeholder
  • Git - 将推送的提交移动到新分支(重命名分支而不是强制推送?)

    还有一个问题几乎完全描述了我的情况 Git 将推送的提交移动到不同的分支 https stackoverflow com questions 9086886 git moving pushed commits to a different
  • Emacs 邪恶模式:如何创建一个新的文本对象来选择带有任何非空格字符的单词?

    我正在尝试在 Evil 中创建一个新的文本对象 例如 文本对象iw只会选择包含连字符的字符串子集 我希望新的文本对象能够将单词与任何非空格字符相匹配 到目前为止我得到的是 evil define text object evil inner
  • 正则表达式拆分 key=value

    我有一个像这样的字符串 KEY1 Value1 KE Y2 V LUE2A Value2B Key3 KEY4 V AL UE4 KEY5 Value5 我需要将其拆分以获得带有键值对的 Map 值在 应作为单个值传递 KE Y2是一个关键
  • 使用 Xamarin.iOS 获取 iOS Library 文件夹的正确方法是什么?

    这将获取我的 iOS 应用程序的文档根目录 Environment GetFolderPath Environment SpecialFolder MyDocuments 有没有类似的东西可以到达Library folder var doc
  • 静态属性未在 UI 中更新

    我花了最后一个小时试图在谷歌和 stackoverflow 中找到答案 我遵循了不同的意见和建议 但到目前为止没有任何效果 我当前的代码如下所示 public class GlobalManager ViewModelBase static
  • Oracle 中四舍五入到特定有效数字位数

    oracle 是否有舍入函数可以四舍五入到特定数量的有效数字 例如 将 1278 舍入到 1300 四舍五入到两位有效数字 Try ROUND x d FLOOR LOG 10 x 1 where d是有效位数 x是要四舍五入的值 Exam
  • /docker-entrypoint-initdb.d 文件夹中的脚本将被忽略

    我需要使用一些 SQL 命令配置 Postogres 但我放入 docker entrypoint initdb d 文件夹中的所有内容都不会被执行 我正在使用 postgres 9 6 图像 我的 Dockerfile 如下 FROM p
  • 包使用冲突:捆绑包启动时的导入包

    尝试安装 htmlunit 捆绑包时出现以下错误 com springsource com gargoylesoftware htmlunit 2 6 0 370 could not be resolved Reason Package u
  • 如何将本地不同的 Git 分支推送到 Heroku/master

    Heroku 的政策是忽略除 master 之外的所有分支 虽然我确信 Heroku 的设计者对这个政策有很好的理由 我猜测是为了存储和性能优化 但对我作为开发人员来说 结果是无论我正在研究什么本地主题分支 我都想要一种简单的方法将 Her
  • CakePHP 无法写入某些文件

    我开始使用 CakePHP 为我的框架开发一个网站 我实际上刚刚开始并且已经遇到了错误 我无法理解它们的含义 Warning cake core cache was unable to write cake dev en us to Fil
  • CSS加载后触发的jQuery事件?

    我的页面上有几个链接 在 div 允许您更改 CSS 样式表 theme selector a click function var path this attr href head link remove head append retu
  • 我可以使用 CALayer 来加速视图渲染吗?

    我正在制作一个自定义 NSView 对象 其中一些内容经常更改 而另一些内容则很少更改 事实证明 变化较少的部分需要花费最多的时间来绘制 我想做的是将这两个部分渲染在不同的层中 以便我可以分别更新其中一个或另一个 从而使我的用户免受缓慢的用
  • 未确定的泛型类型在 ghci 的运行时中如何表示

    我很清楚通用函数和通用数据类型 在泛型类型中 data SB forall x show x gt SB x instance Show SB where show SB x show x 所以对于任何给定类型x 如果它有一个签名Show