Haskell:let 语句,将数据类型复制到自身(带/不带修改)不起作用

2023-11-29

我想通过更改一个字段来更新记录语法,所以我做了类似的事情:

let rec = rec{field = 1}

但我发现我无法打印rec不再,意味着当我尝试时编译器似乎进入无限循环。所以我尝试这样做:

let a = 1 -- prints OK

let a = a -- now i can't print a (also stuck in a loop) 

所以我做不到let a = a任何类型,但我不明白为什么,以及我应该如何解决这个问题。

顺便说一句:在做的时候:

let b = a {...record changes..}

let a = b

有效,但似乎多余。


你遇到的问题是all let and whereHaskell 中的绑定默认是递归的。所以当你写的时候

let rec = rec { ... }

它尝试定义一个循环数据类型,当您尝试评估它时,它将永远循环(就像let a = a).

没有真正的解决办法——这是语言的权衡。它使递归函数(甚至普通值)更容易编写,噪音更少,但也意味着您不能轻松地重新定义a就其本身而言,有很多次。

你真正能做的唯一一件事就是给你的价值观起不同的名字——rec and rec'将是执行此操作的常用方法。

公平地说,Haskell 经常会出现递归函数甚至递归值。代码如下

fibs = 0 : 1 : zipWith (+) fibs (tail fibs)

一旦你掌握了它的窍门,就会非常好,并且不必明确地将这个定义标记为递归(就像你必须在 OCaml 中所做的那样)是一个明确的好处。

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

Haskell:let 语句,将数据类型复制到自身(带/不带修改)不起作用 的相关文章

  • 我可以获得有关过度限制类型签名的警告吗?

    当我为可能更具多态性的函数提供类型签名时 GHC 或某些 lint 工具可以告诉我吗 GHC 不这样做 快速搜索 Hackage 也没有发现任何结果 实现这样的事情的一个简单但可能非常有效的方法是在 GHCi 中加载模块 使用 browse
  • 整数转浮点数

    这段代码的工作原理 posToXY Float gt Float gt Integer posToXY a b do let y a b round y 但这不起作用 posToXY Integer gt Integer gt Intege
  • Haskell:找不到模块“Data.List.Split”

    我正在尝试在 Haskell 中拆分列表 据我所知 最简单的方法是splitOn 但是这个函数需要Data List Split 所以我尝试运行import Data List Split在前奏曲中 但是 我收到以下错误 Could not
  • 导入 Haskell 模块

    我是哈斯克尔的新手 为什么当我尝试使用时Days from Data Time我收到此错误 Could not find module Data Time It is a member of the hidden package time
  • Haskell 中的实例声明

    我有这两个功能 primes sieve 2 where sieve p xs p sieve x x lt xs x mod p gt 0 isPrime number number 1 null x x lt takeWhile x g
  • 在 Haskell 中增长数组

    我想在 Haskell 中实现以下 命令式 算法 给定一个序列对 e0 s0 e1 s1 e2 s2 en sn 其中 e 和 s 部分不一定是自然数不同的是 在每个时间步都会随机选择该序列的一个元素 例如 ei si 并根据 ei si
  • 这个记忆的斐波那契函数是如何工作的?

    在我正在做的函数式编程课程的当前练习作业中 我们必须制作给定函数的记忆版本 为了解释记忆化 给出以下示例 fiblist fibm x x lt 0 fibm 0 0 fibm 1 1 fibm n fiblist n 1 fiblist
  • 无点镜头创建不进行类型检查

    在函数中test 我遍历一个列表 从它的成员生成镜头 然后打印一些数据 当我使用有针对性的呼叫风格时 这会起作用 当我使其成为无点时 它无法进行类型检查 为什么会出现这种情况 我该如何解决这个问题 在我看来 GHC 并没有保留排名较高的信息
  • 我应该在 Turtle 或 Foldl 包中使用折叠吗?

    我在使用 Turtle 时遇到了一些困难 直到盯着难以理解的错误消息几分钟后才意识到我使用了错误的fold功能 https hackage haskell org package turtle 1 5 8 docs Turtle Shell
  • 持久 selectList 导致错误“无法将类型‘BaseBackend backend0’与‘SqlBackend’匹配”

    我遇到以下编译错误 Couldn t match type BaseBackend backend0 with SqlBackend arising from a use of runSqlite The type variable bac
  • 纯函数怎么能做IO呢?

    我最近了解到莫纳德随机数 http hackage haskell org package MonadRandom 0 1 13 docs Control Monad Random Class html t 3aMonadRandom图书馆
  • 如何在 Haskell 中向右或向左移动列表的 1 个元素?

    嗨 我一直在寻找答案 但找不到 假设我们有一个像这样的列表 1 10 4 5 3 我怎样才能将 5 向左移动 使这个列表变成 1 10 5 4 3 我尝试过了swapElementsAt通过找到该元素的索引 但它看起来非常不足 swapEl
  • 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
  • 标准的能力

    我发现了一些使用标准的旧例子here http www serpentine com blog 2009 09 29 criterion a new benchmarking library for haskell 看起来好像早在 2009
  • 简单 Haskell Monad - 随机数

    我正在尝试扩展代码这个帖子 https stackoverflow com questions 3944170 haskell and state 接受的答案 允许我能够基于以种子作为参数的函数 randomGen 调用 randomGen
  • 用于遇到 [...] 的 Haskell Parsec 解析器

    我正在尝试使用 Parsec 在 Haskell 中编写一个解析器 目前我有一个可以解析的程序 test x 1 2 3 end 执行此操作的代码如下 testParser do reserved test v lt identifier
  • : 中缀运算符在 Haskell 中的作用是什么?

    我正在阅读Haskell 简要介绍 http www haskell org tutorial index html 这不是那么温和 并且它反复使用 操作符而不直接解释它的作用 那么 它到底有什么作用呢 是 前置 运算符 x xs 返回一个
  • 在 monad 转换器类型类中使用列表 monad?

    我的目标是创建一个在 ReaderT WriterT 堆栈或 RWS 堆栈中使用列表 monad 的函数 更一般地说 如何在 mtl 类型类 例如 MonadReader MonadWriter 中使用列表 monad 我为什么要尝试这样做
  • 不同编程语言中的浮点数学

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

随机推荐

  • 读取串行输入并打印到 Tkinter GUI

    我正在尝试制作一个基于 Tkinter 的 GUI 用于 Arduino 打印传感器值并响应用户输入 我试图用来消除 while 循环的代码是这样的 它不打印任何传感器信息 唯一的输出是 正在尝试 dev ttyACM0 然后打开 tkin
  • 获取 .bat 文件中的图像文件尺寸

    我有一个bat文件 列出了文件夹中所有图像的路径 代码是 echo off break gt infofile txt for f delims F in dir b s bmp do echo F 1 1 1 100 100 gt gt
  • 如何在 nginx 中包含位置块?

    我在用着nginx作为 2 个网络应用程序的反向代理 这两个网络应用程序 UI 共享位置代理 因为后端服务是共享的 如何组合位置块并将它们包含在服务器中 主机配置文件 server server name app1 com listen 8
  • 加密加密属性文件中的密码

    Problem 我正在使用 Apache CXF 3 0 7 并在新功能您可以在加密属性文件中存储密钥库密码的 BASE 64 编码 加密版本 但我不知道如何添加它 我没有找到此实现的示例 在 apache web 中说 加密属性文件内容的
  • 为什么 NULL = NULL 在 SQL Server 中计算结果为 false

    在 SQL Server 中 如果你有nullParam NULL在 where 子句中 它的计算结果始终为 false 这是违反直觉的 给我带来了很多错误 我确实明白IS NULL and IS NOT NULL关键字是正确的方法 但为什
  • 如何解决 Multer 错误:意外的表单结束?

    我发现了有关 Multer 的其他类似问题 但没有答案 我正在尝试使用 next js 前端 和 node js 后端 上传文件 使用开发工具时 数据是通过网络选项卡发布的 以下是我的设置 app js const express requ
  • iOS 6.0 MPMoviePlayerController 全屏模式黑色?然后应用程序不再阻止任何操作

    当屏幕为黑色时 MPMoviePlayerController 视频将进入全屏模式 然后该应用程序就被屏蔽了 此问题仅适用于 iOS 6 0 但 iOS 5 1 运行良好 这是我的代码 如果我双击播放器全屏打开 但显示黑屏 self mov
  • PHP 数组语法:array(...) 或 [...] [关闭]

    Closed 这个问题是基于意见的 目前不接受答案 在 PHP 中 这些相同吗 x 1 2 3 and x array 1 2 3 这两种创建数组的方法是否存在不同的情况 有什么理由使用其中一种而不是另一种吗 它们与警告相同 x 1 2 3
  • 在 Access 中从另一个表的数据创建一个表

    这个问题是关于 MS Access 的 我想做的是 我在 Access 中有一个表 并且想使用第一个表中的数据创建另一个表 希望通过一些 VBA 代码自动创建 有关于如何执行此操作的任何建议吗 我对 VBA 和 Access 很陌生 因此任
  • Web API:具有不同 HTTP 动词的相同方法

    在 WEB API 控制器中 我们可以使用相同的方法名称和不同的 HTTP 动词吗 HttpGet public string Test return Success Get HttpPost public string Test int
  • 正则表达式多个条件

    我有一个包含 URL 的字符串 例如https xxxx yyyy com en 我怎样才能制作一个正则表达式来验证这一点both这些条件都满足吗 网址不包含xxxx The URL does包含任一 en or en 您可以使用 xxxx
  • 重定向选择框中的选择选项

    目前我正在使用这个
  • 合并具有大写和非大写版本的变量名称的列,而不指定变量名称

    我有一个 大 数据框 如下所示 library data table DT lt fread ID country year A b B a 4 NLD 2002 NA 1 NA 0 5 NLD 2002 NA 0 NA 1 6 NLD 2
  • 接近恒定时间旋转,不违反标准

    我花了很长时间试图想出一个不违反 C C 标准的恒定时间旋转 问题是边缘 角落情况 其中操作在算法中调用并且这些算法无法更改 例如 以下内容来自Crypto 并执行下面的测试工具海湾合作委员会乌桑 i e g fsanitize undef
  • 如何使用 Java prefuse 库创建条形图?

    我目前有prefuse绘制散点图 其中 X 轴是计算机名称 Y 轴是其温度 如何让它绘制显示值而不是离散点的条形 我目前正在使用以下代码来呈现点 ShapeAction shape new ShapeAction group Constan
  • 如何过滤大于x的数组值

    我一直在互联网上查找 但找不到任何介绍如何解决此问题的帖子 尽管我确信这是一个非常简单的修复 基本上我有一个包含数字值的数组 我想过滤掉任何大于 10 的数字并将它们添加到另一个数组中 这是到目前为止我所得到的 但我得到的是第一个数组中的所
  • 如何从 QUnit 测试触发本机 Javascript 事件?

    我正在开发一个不依赖于 jQuery 的 Javascript 库 尽管我的测试中可以使用 jQuery 和 QUnit 在库中 我按照 jQuery 的方式将事件附加到元素 if document addEventListener tab
  • 如何使用水豚has_text

    所以现在我已经让黄瓜 水豚 硒点击谷歌应用程序脚本 这很棒 但由于某种原因 我似乎无法按照我期望的方式检查页面正文中的文本 在调试器中 我可以抓取页面对象 我可以在浏览器中获得预期的文本 直接扫描html显示文本出现了两次 但是page h
  • 如何通过调整缓冲区大小来优化读写?

    如何优化标准 C C 11 中 std ifstream 和 std ofstream 的读写速度 无 POSIX 函数 1 我不太清楚缓冲区的作用 所以你能确认一下吗 用于读取 文件的很大一部分被预加载到内存中 因此缓冲区大小定义了这大部
  • Haskell:let 语句,将数据类型复制到自身(带/不带修改)不起作用

    我想通过更改一个字段来更新记录语法 所以我做了类似的事情 let rec rec field 1 但我发现我无法打印rec不再 意味着当我尝试时编译器似乎进入无限循环 所以我尝试这样做 let a 1 prints OK let a a n