Core Haskell 将类型应用于函数意味着什么?

2023-12-07

我为 Core Haskell 编写了一个自定义的漂亮打印机,以便更好地研究 Core 的结构。这台漂亮打印机的要点是,它需要核心模块并在输出中包含数据构造函数,默认情况下Outputable执行好像不行。

这是我运行漂亮打印机的模块的代码:

module Bar2 where

add :: Int -> Int -> Int
add a b = a + b

add2 a b = a + b

这是漂亮的打印机输出:

------------------------------- Module Metadata --------------------------------
Module { "main" :: modulePackageId, "Bar2" :: moduleName }
-------------------------------- Type Bindings ---------------------------------
[r0 :-> Identifier ‘add’, rjH :-> Identifier ‘add2’]
-------------------------------- Core Bindings ---------------------------------
NonRec (Id "add2")
       (Lam (TyVar "a")
            (Lam (Id "$dNum")
                 (Lam (Id "a1")
                      (Lam (Id "b")
                           (App (App (App (App (Var (Id "+"))
                                               (Type (TyVar (TyVar "a"))))
                                          (Var (Id "$dNum")))
                                     (Var (Id "a1")))
                                (Var (Id "b")))))))

NonRec (Id "add")
       (Lam (Id "a")
            (Lam (Id "b")
                 (App (App (App (App (Var (Id "+"))
                                     (Type (TyConApp (Int) [])))
                                (Var (Id "$fNumInt")))
                           (Var (Id "a")))
                      (Var (Id "b")))))
--------------------------------- Safe Haskell ---------------------------------
Safe
------------------------------------- End --------------------------------------

让我感到困惑的是,在这两种情况下,Core 似乎都将类型变量或类型构造函数应用于+功能,以及一些$dNum or $fNumInt在接受论点之前。

For the add函数,类型也明确给出,而add2留给编译器推断。这似乎也会影响 lambda 函数链求值所需的参数数量,其中add需要 2 同时add2要求 4.

这是什么意思呢?


核心就差不多了SystemF(从技术上来说SystemFC)。在 SystemF 中,类型变量也需要作为函数的参数。在你的例子中,Haskell 推断

add2 :: Num a => a -> a -> a 
add2 a b = a + b

这解释了TyVar "a"论证add2.

此外,Haskell 必须找到一种方法来分派到“正确的”集合Num函数取决于参数的类型a and b是。它通过为每个类型类约束提供一个字典参数来实现这一点。这就是Id $dNum争论。如果是add, Haskell 已经知道哪个字典合适(+)可以找到函数,因为它知道它知道操作正在进行Int(所以不需要传入:它只是$fNumInt).

本质上,在幕后发生的事情是 Haskell 为每个类型类创建一个记录data $d<Class> = ...字段是类型类内的函数。然后,对于每个实例,它会生成另一个实例$f<Class><Type> :: $d<Class>. 这里有更详细的解释

这是另一个描述核心相关事物的优秀答案。

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

Core Haskell 将类型应用于函数意味着什么? 的相关文章

随机推荐

  • 传单中圆形和多边形的联合

    我正在向传单地图添加两个圆圈和一个多边形 这是我绘制这三个形状的代码 有什么办法可以得到这三个形状的联合吗 leaflet options leafletOptions minZoom 0 maxZoom 18 m lt leaflet g
  • 如何在没有宏的情况下自动创建 Clojure `defn` 函数?

    最初是出于以下问题的动机 映射到 clojurescript 宏的调用 假设您想自动创建许多类似的函数 即不需要全部手写 假设我们有一些预先存在的函数 并且希望用处理程序包装它们以进行某种回调 defn do foo println I f
  • decltype 和成员函数(非指针)类型

    struct C int Foo int i return i typedef decltype C Foo type 由于不存在成员函数类型这样的类型 没有 是吗 我希望C type to be int int 但以下内容无法使用 Vis
  • Flex:无法调整外部加载的 SWF 内容的大小

    我有一个应用程序 我尝试加载外部 SWF 所以 我们有 我的应用 舞台的尺寸为 768x1280 缩放模式 EXACT FIT 外部 SWF 这是另一个应用程序 其阶段为 800x600 缩放模式 EXACT FIT 问题是 尽管我应用 s
  • Tomcat 未加载 MSSQL 驱动程序

    我正在尝试将我的 web 应用程序部署到 Tomcat 容器 但出现异常 指出找不到数据库的驱动程序 我在 Jetty 上本地测试了该应用程序 driver jar 由 Maven 提供 我将 driver jar 复制到 Tomcat 主
  • 将 (720, 720) 的 pandas DataFrame 重塑为 (518400, ) 2D 为 1D

    我有一个形状为 720 720 2D 的 DataFrame 我想将其转换为一维维度而不更改其值 我该如何使用 Pandas 来做到这一点 Use numpy ravel将 DataFrame 转换为 numpy 数组 np random
  • 未捕获的类型错误:无法读取 ReactJs 中 {Component}.render 处未定义的属性“映射”

    我将我的数组传递给这样的侧边栏组件的道具 我想在我的子组件中访问它 When i save the code and go to browser i am getting this error message import React Co
  • 如何在java中创建类型安全的泛型数组?

    我想在 java 中创建一个通用数组 维护 Java 通常提供的类型安全性 我正在使用这段代码 class Stack
  • “of”与“from”运算符

    之间唯一的区别是Observable of and Observable from参数格式 像Function prototype call and Function prototype apply Observable of 1 2 3
  • 1帧内使用opengl es在ipad上最多可以绘制多少个三角形?

    ipad上一帧最多可以画多少个三角形 另外 用于绘制这些三角形的 gl 调用数量是否有限制 您在 iPad 上遇到的三角形总数的唯一限制是内存大小以及您希望渲染的速度 发送的顶点越多 应用程序将使用的内存就越多 渲染速度就越慢 例如 在我的
  • utf8' 编解码器无法解码位置 15 中的字节 0x89:起始字节无效

    这是我的项目的视图 其中我尝试使用 boto 将图像从本地系统上传到 s3 class ImageList generics ListCreateAPIView queryset Image objects all serializer c
  • 如何在gem5中启用ARM半主机?

    我尝试运行在 QEMU 上运行的半主机退出指令 mov r0 0x18 ldr r1 0x20026 svc 0x00123456 但是gem5似乎没有正确处理它并崩溃了 以下补丁将其添加到 baremetal py 但不添加到 fs py
  • jquery改变用户滚动的背景颜色

    jquery 是否有可能在用户向下滚动页面时背景动画从 50 白色变为 90 白色或其他 所以首先是颜色rgba 255 255 255 5 当用户滚动到颜色下方 210px 时become rgba 255 255 255 9 更新后的更
  • Darwin/MacOS 是否修改了 Bash?

    我想知道使用 Bash 内置命令的 Bash 脚本的可移植性 据我了解 每种 UNIX 风格都倾向于修改各种 UNIX 实用程序 但他们是否倾向于不理睬 Bash 和 Bash 内置函数呢 尤其是 MacOS 呢 据我所知 bash 在 M
  • 从 C++ 扩展中获取 MIME 类型

    有什么方法可以在给定文件扩展名的情况下获取 C 中的 MIME 类型吗 我读过有关 HKEY CLASSES ROOT 的内容 但老实说我不知道 如何使用它 我想要的是作为输入 string extension pdf string ext
  • SWT 是否分发可在任何受支持的操作系统上运行的 JAR?

    The SWT项目目前为每个受支持的操作系统维护一个可分发的版本 例如 swt 3 4 2 win32 win32 x86 zip swt 3 4 2 gtk linux x86 zip swt 3 4 2 carbon macosx zi
  • EF 6 - 如何正确执行并行查询

    创建报告时 我必须执行 3 个涉及相同上下文的独立实体的查询 因为它们很重 所以我决定使用 ToListAsync 为了让它们并行运行 但是 令我惊讶的是 我得到了一个例外 使用 EF 6 并行执行查询的正确方法是什么 我应该手动启动新任务
  • 为什么使用 LWUIT 的三星手机不支持阿拉伯字体?

    我已经在一些三星手机上测试了我的移动应用程序以进行测试 三星 Corby b3410 和三星 c6712 这些手机上未显示阿拉伯字体 但它可以在诺基亚手机上正常工作 我在用着System font用于显示阿拉伯字体 为什么这些手机不支持 如
  • Latin-1 / UTF-8 编码 php

    我有一个 UTF 8 编码与 Latin 1 混合的数据库 我认为这就是问题所在 这就是字符在数据库中的样子 should be 当我将标题设置为 然后字符就出来了 当我删除标题时 它们会像数据库中一样出现 我希望他们像这样出来 如果可能的
  • Core Haskell 将类型应用于函数意味着什么?

    我为 Core Haskell 编写了一个自定义的漂亮打印机 以便更好地研究 Core 的结构 这台漂亮打印机的要点是 它需要核心模块并在输出中包含数据构造函数 默认情况下Outputable执行好像不行 这是我运行漂亮打印机的模块的代码