伊德里斯热切评价

2024-01-10

In Haskell,我可能会实施if像这样:

if' True  x y = x
if' False x y = y
spin 0 = ()
spin n = spin (n - 1)

This 行为符合我的预期:

haskell> if' True  (spin 1000000) ()  -- takes a moment
haskell> if' False (spin 1000000) ()  -- immediate

In Racket,我可以实现一个有缺陷的if像这样:

(define (if2 cond x y) (if cond x y))
(define (spin n) (if (= n 0) (void) (spin (- n 1))))

This 行为符合我的预期:

racket> (if2 #t (spin 100000000) (void))  -- takes a moment
racket> (if2 #f (spin 100000000) (void))  -- takes a moment

In Idris,我可能会实施if像这样:

if' : Bool -> a -> a -> a
if' True  x y = x
if' False x y = y
spin : Nat -> ()
spin Z = ()
spin (S n) = spin n

This 行为让我感到惊讶:

idris> if' True  (spin 1000) ()  -- takes a moment
idris> if' False (spin 1000) ()  -- immediate

我期望 Irdis 表现得像 Racket,两个参数都是 评价。但事实并非如此!

伊德里斯如何决定何时评估事物?


我们说 Idris 具有严格的评估,但这是针对其运行时语义的。

作为一种完全依赖类型的语言,Idris 有两个评估事物的阶段:编译时和运行时。在编译时,它只会评估它知道的全部内容(即终止并覆盖所有可能的输入),以保持类型检查的可判定性。编译时求值器是 Idris 内核的一部分,并使用 HOAS(高阶抽象语法)样式的值表示在 Haskell 中实现。由于这里已知一切都具有范式,因此评估策略实际上并不重要,因为无论哪种方式都会得到相同的答案,并且实际上它将执行 Haskell 运行时系统选择执行的任何操作。

为了方便起见,REPL 使用编译时求值概念。因此,您的“旋转 1000”实际上从未得到评估。如果您使用相同的代码制作可执行文件,我希望看到非常不同的行为。

而且更容易实现(因为我们有可用的求值器),这对于显示术语在类型检查器中如何求值非常有用。所以你可以看到以下之间的区别:

Idris> \n, m => (S n) + m
\n => \m => S (plus n m) : Nat -> Nat -> Nat

Idris> \n, m => n + (S m)
\n => \m => plus n (S m) : Nat -> Nat -> Nat

如果我们在 REPL 上使用运行时评估,这会更困难(尽管并非不可能),而这在 lambda 下不会减少。

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

伊德里斯热切评价 的相关文章

  • 访问函数中的环境

    In main我可以读取我的配置文件 并将其提供为runReader somefunc myEnv正好 但somefunc不需要访问myEnv读者提供 链中的下一对也没有提供 需要 myEnv 中某些内容的函数是一个微小的叶函数 如何在不将
  • ErrorT 已弃用,但 exceptT 不适合

    我有一个一元计算 在某些时候 由于单子模式匹配 它开始需要 MonadFail 约束 我的简单解决方法是使用以下命令运行它 fmap either error id runErrorT 然而哎呀 Deprecated Use Control
  • 如何为强制长度为 2^n 的向量类型定义可用的 Applicative 实例

    对于某些应用程序 我需要长度为 2 n 的向量 为了强制某些操作的长度匹配 我使用 ist 应用实例定义了我的类型 如下所示 LANGUAGE GADTs DataKinds FlexibleInstances FlexibleContex
  • 如何让 Show 显示函数名称?

    作为一个让我熟悉 Haskell 的简单练习 在 Youtube 上闲逛并偶然进入美国倒计时游戏节目之后 我想为数字游戏制作一个求解器 你得到 6 个数字 需要将它们与 为了得到给定的结果 到目前为止我所得到的是非常脑死亡的 let ope
  • 我怎样才能制作自己的惰性迭代器?

    我正在创建一个生成大量数据的 C 11 类 该数据当前来自数据库 无法完全放入内存中 我想为用户提供一个行为类似于常规 STL 迭代器的迭代器 但这会很懒 更准确地说 我可以做这样的事情 for auto item big bunch of
  • 将数据类型设置为 Kind * -> * 这不是函子

    布伦特 约尔吉类型分类百科全书 https www haskell org haskellwiki Typeclassopedia给出以下练习 举一个类型的例子 gt 不能将其制成 的实例Functor 不使用undefined 请告诉我什
  • Haskell scala 互操作性

    我是 Scala 初学者 来自面向对象范式 在了解 Scala 的函数式编程部分时 我被引导到 Haskell 纯函数式编程语言 探索 SO 问题答案 我发现 Java Haskell 具有互操作性 我很想知道 Scala Haskell
  • Haskell:是的,没有类型类。为什么是整数?

    我有一个关于 GHCi 如何假定整数类型的问题 我正在阅读 Learn you a Haskell 是 否类型的课程 如果您想阅读全文 这里有一个链接 http learnyouahaskell com making our own typ
  • Haskell - 用防护罩替换外壳

    我想知道在这部分代码中是否可以用守卫替换 case 语句 firstFunction String gt Maybe MyType secondFunction MyType gt Integer myFunction String gt
  • 规范化且不可变的数据模型

    Haskell如何解决 规范化不可变数据结构 问题 例如 让我们考虑一个表示前女友 男友的数据结构 data Man Man name String exes Woman data Woman Woman name String exes
  • 如何在 Haskell 中安装库?

    我尝试使用控制 Monad Extra andM https hackage haskell org package extra 1 7 10 docs Control Monad Extra html import Control Mon
  • Haskell 泛化问题(涉及列表理解)

    假设我想知道a上的所有要点 x y 矩形内的平面has 我可以使用列表推导式来计算 如下所示 let myFun2D x y x lt 0 2 y lt 0 2 现在 如果我想为一个人完成同样的事情 x y z 空间 我可以采取同样的方式并
  • 使用 FoldLine 解析多个块

    对于这个简化的问题 我试图解析一个如下所示的输入 foo bar baz quux woo hoo xyzzy glulx into foo bar baz quux woo hoo xyzzy glulx 我尝试过的代码如下 import
  • Haskell 入门

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 几天来 我一直试图理解 Haskell 中的函数式编程范例 我通过阅读教程和观看截屏视频
  • Haskell Stack 从 github 安装包依赖项

    是否可以使用 Haskell 堆栈从 github 安装软件包的版本 例如在一个 cabal or a stack yaml文件 如何在 git repo branch revision 上指向依赖项 对于堆栈 The 的文档stack y
  • 有没有更好的方法将 UTC 时间转换为大纪元时间?

    我想将文件的修改时间设置为从 exif 数据获取的时间 为了从 exif 获取时间 我发现 Graphics Exif getTag Exif gt String gt IO Maybe String 要设置文件修改时间 我发现 Syste
  • Haskell 对于 Web 应用程序来说足够成熟吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • 如何在Haskell中实现词法分析器和解析器

    我在这里得到了这段代码 它是用Haskell结构的命令式编程语言编写的程序 所以问题是 我如何为这种语言实现词法分析器和解析器 该程序被定义为一系列语句有 6 种类型 goto write stop if goto 和 int int n
  • 如何打乱列表?

    如何从一组数字 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
  • 如何更换HXT中的节点?

    给定一个示例 xml 文件

随机推荐

  • Chrome 正在由自动化测试软件控制

    我正在 Chrome 中使用 Serenity BDD Selenium 运行自动化测试 我必须下载新的 ChromeDriver 因为我的测试无法运行 gt 测试将打开 ChromeDriver 但无法 以用户身份浏览 当我用谷歌搜索这个
  • 为什么声明转换不会减少 cookie 大小?

    我正在使用 Azure AD net core 2 1 并已注册我的应用程序并将其配置为返回 AD 组作为声明 我还使用声明转换来删除除我的应用程序使用的三个组之外的所有组声明 这成功地消除了 100 多个组 我这样做是希望能够减少后续请求
  • SQL Server 2008 - 连接字符串

    我需要获取每个行项目的查询结果 并构建一个以分号分隔的组成该项目的材料列表 架构构成 表格 LineItems 唯一项目列表 LineItems Materials 多对多 材料 独特材料清单 行项目 ID 行项目 1 1A 1 LineI
  • 覆盖 ComboBox 中的默认 TextBlock 样式

    我在 App xaml 中定义了默认的 TextBlock 样式 它似乎也会影响 ComboBox 项目的文本颜色 现在 如何显式设置主窗口中定义的 ComboBox 的文本颜色 我想保留默认样式 但将组合框文本颜色设置为蓝色而不是红色 A
  • Unity3d android 2d 精灵放置

    Please take a look at this picture It s a final look of the game exported from photoshop I marked the ui sprites with re
  • 将鼠标悬停在 jtable 单元格上时显示图像

    我有一个使用 DefaultTableModel 创建的 JTable 我想在鼠标悬停在该 JTable 的特定单元格上时显示图像 并且我需要每个单元格的图像都不同 提前致谢 您可以覆盖prepareRenderer of the JTab
  • iOS - 运行 Swift 单元测试时找不到“MyProject-Swift.h”文件

    我正在尝试为我的项目设置单元测试 它是一个现有的 Objective C 应用程序 我最近向其中添加了一个 Swift 类 我已经设置了 MyProject Swift h 和 Swift 桥接文件 MyProject 和 MyProjec
  • Wordpress 和 Nginx 与 Docker:未加载静态文件

    我正在使用 Docker 来为我的简单 WordPress 网站提供服务 一个 nginx 容器和一个 wordpress 容器 简单设置 upstream wordpress english server wordpress en 80
  • 如何计算MPR的dicom切片之间的空间?

    由于显示MPR view基于 Dicom 我用一系列 dicom 文件制作了一个 3D 数组 我展示它来自Coronal and Sagittal sides My 3D array includes z count of dicoms c
  • Google Cloud SQL PG11:无法调整共享内存段的大小

    我最近在 Google Cloud SQL 上将 Postgres 9 6 实例升级到 11 1 从那时起 我开始注意到多个查询中存在大量以下错误 org postgresql util PSQLException 错误 无法调整共享大小
  • 如何通过 JavaScript 调用 PHP 函数?

    我正在尝试将 PHP 函数从外部 PHP 文件调用到 JavaScript 脚本中 我的代码不同且庞大 因此我在这里编写示例代码 这是我的 PHP 代码 这是我的 JavaScript 代码
  • 如何在 Text Widget Flutter 中使用换行符

    如何在Flutter中显示多行文本 Text Text1 n Text2 n Text3 maxLines 20 style TextStyle fontSize 16 0 fontWeight FontWeight bold color
  • FPDF 错误:无法包含字体规格文件

    我有一个由其他人完成的应用程序 现在我被要求调查一个问题 生成 pdf 报告时会抛出错误 此应用程序使用 FPDF 生成 PDF FPDF error Could not include font metric file 早些时候它抛出了以
  • 如何禁止在 Windows 上的 qmake 中添加“d”后缀来调试库名称?

    我在 QtCreator 中为 QML C 插件创建了项目 调试版本的名称附加了 d 后缀 例如plugind dll代替plugin dll 如何配置项目不添加这个后缀 Qt 版本 4 8 1 Windows 7 您可以将此行写入 pro
  • 如何使用 C# 中的相对路径实例化新的 ChromeDriver?

    它使用绝对路径 例如 WebDriver new ChromeDriver C Users
  • Phonegap Android:未知的铬错误:-6

    我正在创建一个 Phonegap Android 应用程序 但在向其中添加插件时遇到了问题 Cordova版本是2 2 0 我没有使用 jQM 或 Sencha Touch 我在 Android 4 0 上测试了该应用程序 我参考的插件是A
  • python中元组的多重嵌套字典

    我有这个元组列表 list of tuples 0 1 1 1 1 1 1 2 1 1 3 1 1 4 0 3 3 3 1 3 3 2 3 3 3 3 3 4 3 3 5 0 4 4 4 1 4 4 2 4 4 3 4 4 4 4 4 5
  • GSON 泛型序列化[重复]

    这个问题在这里已经有答案了 可能的重复 使用 gson 反序列化泛型 https stackoverflow com questions 4364392 deserializing generics with gson 所以我需要做 Typ
  • R Bookdown _bookdown.yml

    Bookdown 有很多配置选项 我发现很难理解如何知道一个选项是否存在 以及这些选项背后的逻辑 具体来说 我发现很难描述什么kind选项进入 bookdown yml鉴于至少还有其他两个地方可以说明选项 In output yml 函数调
  • 伊德里斯热切评价

    In Haskell 我可能会实施if像这样 if True x y x if False x y y spin 0 spin n spin n 1 This 行为符合我的预期 haskell gt if True spin 1000000