类型推断会干扰引用透明度

2024-01-12

Haskell 语言在引用透明度方面提供的精确承诺/保证是什么?至少哈斯克尔报告没有提到这个概念。

考虑表达式

(7^7^7`mod`5`mod`2)

我想知道这个表达式是否为 1。为了我的安全,我会执行两次:

( (7^7^7`mod`5`mod`2)==1, [False,True]!!(7^7^7`mod`5`mod`2) )

现在给出(True,False)与 GHCi 7.4.1。

显然,这个表达式现在在引用上是不透明的。我如何判断程序是否存在此类行为?我可以淹没该程序::一切都结束了,但这并没有使它变得非常可读。中间还有其他我想念的 Haskell 程序吗?那是介于完全注释和未注释之间吗?

(除了唯一有点相关问题 https://stackoverflow.com/questions/14865734/referential-transparency-with-polymorphism-in-haskell我发现这一定还有别的东西)


我不认为有任何保证评估多态类型表达式,例如5对于“兼容”的任何合理定义,不同类型都会产生“兼容”结果。

GHCi 会议:

> class C a where num :: a
> instance C Int    where num = 0
> instance C Double where num = 1
> num + length []  -- length returns an Int
0
> num + 0          -- GHCi defaults to Double for some reason
1.0

这看起来打破了引用透明度,因为length [] and 0应该是平等的,但在幕后它是num它被用于不同的类型。

Also,

> "" == []
True
> [] == [1]
False
> "" == [1]
*** Type error

人们可以预料到的False在最后一行。

因此,我认为引用透明度仅在指定确切类型来解决多态性时才有效。 System F 中的显式类型参数应用程序可以始终用变量的定义替换变量,而不改变语义:据我了解,GHC 在优化过程中内部正是这样做的,以确保语义不受影响。事实上,GHC Core 具有可传递的显式类型参数。

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

类型推断会干扰引用透明度 的相关文章

  • 你能识别 Haskell 程序中的无限列表吗? [复制]

    这个问题在这里已经有答案了 可能的重复 如何判断列表是否是无限的 https stackoverflow com questions 7371730 how to tell if a list is infinite 在Haskell中 你
  • Haskell 标准库是什么?

    GHC专用库可以称为标准库吗 或者只有 Haskell 2010 报告中的那些才算数 许多 GHC 库可以通过 Haskell 报告中的函数来实现 可能与 C 绑定相结合 但其他语言依赖于 GHC 特定的扩展 因为语言报告中定义的当前 Ha
  • 在 Haskell 中合并两个列表

    无法弄清楚如何合并两个列表通过以下方式在哈斯克尔 INPUT 1 2 3 4 5 11 12 13 14 OUTPUT 1 11 2 12 3 13 4 14 5 我想提出一个更懒的合并版本 merge ys ys merge x xs y
  • Data.Sequence 中的 inits 和 tails 如何工作?

    Louis Wasserman 编写了当前的实现inits and tails in Data Sequence 他表示它们非常高效 事实上 只要查看代码 我就可以看到 无论它们在做什么 它们都是以干净 自上而下的方式进行的 这往往会给惰性
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 管道:多个流消费者

    我编写了一个程序来计算语料库中 NGram 的频率 我已经有一个函数 它消耗一串令牌并生成一个订单的 NGram ngram Monad m gt Int gt Conduit t m t trigrams ngram 3 countFre
  • 如何打乱列表?

    如何从一组数字 1 2 3 直到我击中x 我的计划是重新调整列表 1 2 3 并把它砍在x chopAt 3 2 3 1 2 3 chopAt 3 2 1 3 2 1 3 chopAt 3 3 1 2 3 chopAt chopAt x y
  • 迭代打印列表中的每个整数

    假设我有一个整数列表l 1 2 我想打印到stdout Doing print l产生 1 2 假设我想打印不带大括号的列表 map print l产生 No instance for Show IO arising from a use
  • 使用带有两个列表而不是一个列表的地图。可以筑巢吗?

    我需要多次运行一个带有两个参数的函数 我有两个包含这些参数的列表 我希望能够使用map或类似的东西用相应的参数调用函数 我要调用的函数具有以下类型 runParseTest String gt String gt IO 列表的创建方式如下
  • 函数式语言中的部分求值和函数内联有什么区别?

    我知道 函数内联就是用函数定义代替函数调用 部分评估是在编译时评估程序的已知 静态 部分 在 C 等命令式语言中 两者之间存在区别 其中运算符与函数不同 但是 在像 Haskell 这样的函数式语言 其中运算符也是函数 中 两者之间有什么区
  • Parsec.Expr 具有不同优先级的重复前缀

    Parsec Expr buildExpressionParser 的文档说 相同优先级的前缀和后缀运算符只能出现一次 即 如果 为前缀否定 则不允许使用 2 但是 我想解析这样的字符串 具体来说 考虑以下语法 sentence ident
  • 自定义 monad 的 MonadTransControl 实例

    的文档monad control提供有关如何创建实例的示例MonadTransControl using defaultLiftWith and defaultRestoreT 该示例适用于以下情况newtype newtype Count
  • 如何让 do 块提前返回?

    我正在尝试使用 Haskell 抓取网页并将结果编译到一个对象中 如果出于某种原因 我无法从页面获取所有项目 我想停止尝试处理页面并提前返回 例如 scrapePage String gt IO scrapePage url do doc
  • Haskell Fibonacci 达到最大指定数?

    我有一个已启动并正在运行的 Haskell 函数 但它做错了事情 它应该输出最多指定最大数量的斐波那契数列 像这样 fibonacciSequence 86 1 1 2 3 5 8 13 21 33 54 我的代码当前输出斐波那契数列中的前
  • Haskell 中多核编程的现状如何?

    Haskell 中多核编程的现状如何 现在有哪些项目 工具和库可用 有哪些经验报道 2009年至2012年期间 发生了以下事件 2012 从 2012 年开始 并行 Haskell 状态更新开始出现在并行 Haskell 摘要 http w
  • 我可以从 GHCi 中找到 GHC 版本吗?

    gt 我在里面输入什么GHCi发现它正在使用哪个 GHC 版本 gt import System Info gt browse arch String compilerName String compilerVersion Data Ver
  • 为什么我不能声明推断类型?

    我有以下内容 runcount Eq a Num b gt a gt b runcount runcountacc 0 runcountacc Eq a Num b gt b gt a gt b runcountacc n runcount
  • 如何让 esqueleto 为我生成 SQL 字符串?

    我怎样才能让esqueleto从a生成一个SQL字符串from陈述 的文档toRawSql说 你可以打开持久的查询日志记录 我尝试了所有可能的形式MonadLogger我可以理解 但它从未打印任何 SQL 同一文档还说 手动使用此功能 是可
  • 与 Functor 不同,Monad 可以改变形状?

    我一直很喜欢以下关于单子相对于函子的力量的直观解释 单子可以改变形状 函子不能 例如 length fmap f 1 2 3 总是等于3 然而 对于单子来说 length 1 2 3 gt gt g往往不等于3 例如 如果g定义为 g Nu
  • Haskell数据类型转换问题

    我目前正在学习 Haskell 并且一直在编写一些非常简单的程序来练习 我的程序之一是 import System IO main do putStrLn Give me year y lt getLine let res show cal

随机推荐

  • 为什么 JSLint 更喜欢点表示法而不是方括号?

    我一直在检查我的一些代码 并收到一些错误 说最好使用点表示法 我发现我使用的是方括号符号 从这篇精彩的文章中可以清楚地看出 https stackoverflow com questions 2001360 javascript dot n
  • 实体框架-存储过程返回值

    我正在尝试获取存储过程的返回值 以下是此类存储过程的示例 select Name IsEnabled from dbo something where ID ID if rowcount 0 return 1 return 这是一个简单的选
  • ANDROID,从Web服务器解析JSON数据并显示在ListView上

    我正在尝试显示 JSON url 链接的 JSON 结果 目前 当我加载时 它什么也不显示 只是空白页面 这是我获取有关 JSON 信息的来源 http adblogcat com parse json data from a web se
  • Orchard CMS:注销(注销)确认页面

    当用户注销前端时是否会触发一个事件 如何使用该事件将用户重定向到特定视图或页面 我希望用户在注销后收到一条消息 显示 您已成功注销 与往常一样 使用 Orchard 有不止一种方法可以做到这一点 方法 1 覆盖用户形状 当您注销时 您将被重
  • 从另一个线程读取复选框状态

    我正在尝试从 WPF 中的 BackgroundWorker 读取复选框的值 这不起作用 bool isSleepChecked checkBoxSleep Dispatcher Invoke DispatcherPriority Norm
  • 模块的循环依赖

    我想用 F 编写一个解析器 并且由于某些原因我必须使用 Antlr 这意味着我必须定义一个Visitor我想要解析的每个 AST 节点的类 现在我遇到的问题是 存在一些具有循环依赖关系的规则 例如 boolExpr boolTerm or
  • PHP 套接字 - 接受多个连接

    我正在尝试创建一个简单的客户端 服务器应用程序 因此我正在尝试使用 PHP 中的套接字 现在我有一个简单的 C 客户端 可以很好地连接到服务器 但我一次只能将一个客户端连接到该服务器 我在网上找到了这个代码示例 并为了测试目的对其进行了一些
  • 使用 mysql/php 的 INSERT 语句中的 WHERE 子句 [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 经过谷歌搜索后 我才知道 我无法在 INSERT 查询中使用 WHERE 子句 但我想在 Book 4 列中插入一个值 其中 Student
  • 如何从 HTA 在默认 Web 浏览器中打开链接?

    我正在开发一个作为 HTA 实现的应用程序 我有一系列链接 我想在系统的默认网络浏览器中打开它们 使用 a href url target blank 无论默认浏览器如何 都会在 IE 中打开链接 有没有办法使用默认浏览器 使用 JavaS
  • 在客户端检测文件上传大小?

    我正在使用 PHP 进行文件上传 在里面PHP手册 http www php net manual en features file upload post method php它显示了一个使用的示例MAX FILE SIZE隐藏字段 表示
  • 使用单个 Gulp 任务运行 Protractor

    有没有办法在单个任务中使用 Protractor 和 Gulp 运行 e2e 测试 现在 为了运行 e2e 测试 我必须打开 3 个单独的 shell 并运行以下命令 webdriver manager update webdriver m
  • 我们可以在 Android 表单中为 Android 组件使用 CSS 吗?

    无论如何 有没有办法为 android 控件使用 css 我们可以为类似的控件创建类吗 谢谢 阿蒂夫 为什么要为 Android 视图定义 CSS 首先让我知道这个问题的答案 否则我想告诉你 你可以在样式 xml http develope
  • 如何在java中将stdin和stdout重定向到文本文件

    如何重定向 stdin 和 stdout 以将数据作为文本文件的输入并将数据作为输出传递到另一个文本文件 我的输入和输出文件如下所示 输入文件 txt 1 2 3 输出应该是输入文件中数字的总和 输出文件 txt 6 您可以设置System
  • 如何从VBA中的选项卡上的控件获取值?

    在选项卡条的不同选项卡中 我有每个选项卡中不同的输入值 我需要编写一个代码来获取所有这些值并执行一些工作 例如在单击按钮时汇总每个选项卡的值 谁能帮我做这个吗 在我的代码中 当我在一个选项卡的文本框中输入值时 它也会更改所有其他选项卡的值
  • 如何在 Zapier 触发器中 JSON.parse 数组?

    我正在尝试 JSON parse 数组 data 我需要能够将数组作为根传递 data type name id 123 响应应该看起来像这样只包含对象 Zapier 似乎不太适合数组 type name id 123 我不应该能够使用一个
  • 水豚的多次会话

    背景 我想在我的网络应用程序上测试以多个用户身份登录 并且我正在使用黄瓜和水豚来执行此操作 我发现这个链接 https tristandunn com 2010 10 21 multiple sessions cucumber seleni
  • mysql oledb 驱动程序

    如何在本地系统中安装 mysql oledb 驱动程序 请给出Mysql oledb连接字符串 Provider OleMySql MySqlSource 1
  • 如何使用 javascript 以 Excel 文件格式导出表单

    下面是我的桌子
  • Android:具有自定义行视图的可扩展导航抽屉

    我正在尝试制作一个带有可扩展元素的导航抽屉菜单 如下所示 gt http goo gl SkMU8N http goo gl SkMU8N 我不知道 所以我开始做这样的事情 不是我的 https github com PrashamTriv
  • 类型推断会干扰引用透明度

    Haskell 语言在引用透明度方面提供的精确承诺 保证是什么 至少哈斯克尔报告没有提到这个概念 考虑表达式 7 7 7 mod 5 mod 2 我想知道这个表达式是否为 1 为了我的安全 我会执行两次 7 7 7 mod 5 mod 2