Haskell 类型系统的细微差别

2024-05-11

我一直在深入了解 haskell 类型系统的本质,并试图了解类型类的要点。我已经学到了很多东西,但我在下面的代码片段上遇到了困难。

使用这些类和实例定义:

class Show a => C a where
  f :: Int -> a

instance C Integer where
  f x = 1

instance C Char where
  f x = if x < 10 then 'c' else 'd'

为什么这会通过类型检查器:

g :: C a => a -> Int -> a
g x y = f y

yes :: C a => a -> Int -> String
yes x y = show (g x y)

但这不是吗?

g :: C a => a -> Int -> String
g x y = show(f y)

我发现第二种选择更具可读性,而且似乎只有很小的区别(注意类型签名)。然而,试图通过类型检查器会导致:

*Main> :l typetests.hs
[1 of 1] Compiling Main             ( typetests.hs, interpreted )

typetests.hs:11:14:
    Ambiguous type variable `a0' in the constraints:
      (C a0) arising from a use of `f' at typetests.hs:11:14
      (Show a0) arising from a use of `show' at typetests.hs:11:9-12
    Probable fix: add a type signature that fixes these type variable(s)
    In the first argument of `show', namely `(f y)'
    In the expression: show (f y)
    In an equation for `g': g x y = show (f y)
Failed, modules loaded: none.

我不明白为什么。

注意:请不要问“你想做什么?”我希望很明显我只是在抽象上下文中闲逛,以便探索这种语言的工作方式。除了学习新东西之外,我没有其他目标。

Thanks


这就是一个有趣的玩具发挥作用的地方。考虑标准 Prelude 函数asTypeOf.

asTypeOf :: a -> a -> a
asTypeOf = const

它只返回第一个参数,无论第二个参数是什么。但它的类型签名施加了额外的约束,即它的两个参数必须是相同的类型。

g :: C a => a -> Int -> String
g x y = show (f y `asTypeOf` x)

现在,GHC 知道什么类型f y是。它与第一个参数的类型相同g。如果没有这些信息,您就会收到所看到的错误消息。只是没有足够的信息来确定类型f y。因为类型很重要(它用于确定要使用哪个实例)show),GHC 需要知道你想要生成代码的类型。

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

Haskell 类型系统的细微差别 的相关文章

随机推荐

  • 取消并重新启动 CountDownTimer 问题

    您好 我在使用 CountDownTimer 函数时遇到问题 首先我可以用 counter cancel 让它停止倒计时 然后我将 milliUntilFinished 值存储在 countercur 中 然后我使用存储的 counterc
  • 2015 年重新审视 Ember Handling 401

    我可以在 Ember Ember Data 中找到大量询问 回答如何从 Rails 后端处理 401 的老问题 许多 如果不是全部的话 在这一点上似乎已经过时了 我已经尝试了我能找到的一切 Ember 数据处理 401 https stac
  • 如何在WP7 WebBrowser控件中注入Javascript?

    我可以通过此链接将 JavaScript 注入到 C Windows 窗体中的 WebBrowser 控件中 如何在WebBrowser控件中注入JavaScript https stackoverflow com questions 15
  • 具有非常大的数字的除法

    我只是想知道在处理大数字时有哪些不同的除法策略 我所说的大数字是指 50 位数字 例如 9237639100273856744937827364095876289200667937278 82637448262718273966299344
  • Xamarin Forms 框架阴影设计

    我有一个带有列表的 Xamarin 内容页面 对于 ListItems 我想要类似于 Android 中的卡片视图的东西 根据我发现可以通过框架来完成 我有这个代码
  • hadoop中reducer的数量

    我正在学习hadoop 我发现减速器的数量非常令人困惑 1 reducer的数量与partition的数量相同 2 reducer 的数量是 0 95 或 1 75 乘以 节点数 每个节点的最大容器数 3 减速机数量设定为mapred re
  • Windows 上的 wchar_t 和 char16_t 是一样的吗?

    我有一个实例std u16string 我可以通过它吗c str 到一个 Win32 API 它期望LPCWSTR 没有任何类型的转换 例如 我可以安全地这样做吗 auto u16s std u16string u Hello SetWin
  • 我想在后端验证来自 golang 前端的时区

    前端在注册期间发送时区以及其他用户详细信息 我需要在时区上放置一个验证器来进行 api 测试 时区数据的格式为 GMT 10 00 Hawaii GMT 08 00 Pacific Time US amp Canada 我所做的是定义数组中
  • 如何从 OpenCover 报告中排除类别

    在使用 OpenCover 为 MSTest 套件生成覆盖率报告 然后使用 ReportGenerator 生成 HTML 报告 时 我尝试排除框架生成的类 特别是 通过服务引用在项目的命名空间下生成的类 我用来生成 XML 文件的命令如下
  • jwt.io 上的“秘密 Base64 编码”是什么意思以及如何使用 `openssl dgst` 模拟它

    我尝试从 jwt io 获得相同的输出openssl 只要我这样做not mark 秘密base64编码 我可以把签名之前的部分 运行它 echo n pasted data from jwt io openssl dgst binary
  • 如何从网页启动 Windows 应用程序?

    我们有一个公司内部网 并且权力机构认为拥有一组代表大多数代表使用的应用程序 Outlook Excel 少数其他应用程序 的图标 链接会很好 这个想法是 如果安装了应用程序 单击链接 图标将在客户端计算机上启动该应用程序 有人曾经有过这样的
  • Android 浏览器是否在 touchStart 上锁定 DOM?

    我正在尝试构建一个包含 5 个块的菜单 用户可以在其中旋转 您可以在这里查看演示 http m iijax com menu php http m iijax com menu php 在 iPhone 上运行良好 有时有点迟缓 但这不是重
  • 用于移动 Web 应用程序的带有图表的框架

    我正在开发一个移动网络应用程序 我需要在饼图中表示一些数据 但是我没有找到任何好的框架来提供良好的选择并在移动设备上正常工作 我想知道一些框架 免费 这可以帮助我 如果您能给出一些基础示例 我会感到惊讶 我正在考虑使用 ajax 技术来显示
  • 如何在 macOS 上的 SwiftUI 中设置拖动图像

    我正在尝试更改 GridView 的默认拖放预览图像 该图像似乎包含网格中的所有可见项目 据我了解 我应该能够设置NSItemProvider previewImageHandler块来自定义所使用的图像 我似乎找不到任何关于返回自定义图像
  • DataContext.CreateDatabase() 表示文件已存在 - 但事实并非如此

    这可能是 Windows 7 问题 但调用 using var context new DataClassesDataContext if context DatabaseExists context CreateDatabase 结果出现
  • C# WPF 如何动态设置属性设置方法?

    我一直在四处寻找 但似乎找不到我要找的东西 所以我会在这里尝试一下 情况 我有 MainWindow 和 MainWindowData 类 MainWindowData 中只有使用 UpdateGUI 属性定义的公共属性 public cl
  • SQL Server、ISABOUT、加权项

    我试图弄清楚加权项在 SQL SERVER 的 ISABOUT 查询中是如何工作的 这是我目前所在的位置 每个查询返回以下行 查询 1 权重 1 初始排名 SELECT FROM CONTAINSTABLE documentParts ti
  • 如何加快列表理解速度

    以下是我的清单 col red yellow blue red green yellow pink orange brown pink brown 我的目标是消除每个列表中出现一次的项目 这是我的代码 eliminate w for w i
  • python 函数是否应该总是返回一些值?

    当我开始使用 python 编码时 一位高级开发人员建议我放置一个return True 一般为布尔值 每当函数的作用域结束时 例如 def mytest try os system convert text pdf text jpg ex
  • Haskell 类型系统的细微差别

    我一直在深入了解 haskell 类型系统的本质 并试图了解类型类的要点 我已经学到了很多东西 但我在下面的代码片段上遇到了困难 使用这些类和实例定义 class Show a gt C a where f Int gt a instanc