在 Haskell 中基于新类型(“包装类型”)构建函数的惯用方法是什么?

2024-01-20

Let StringWrapper1 and StringWrapper2是包裹字符串的两种类型(即newtype StringWrapper1 = StringWrapper1 String and newtype StringWrapper2 = StringWrapper2).

现在假设我们正在尝试创建一个函数StringWrapper1 to StringWrapper2.

funcWrapper :: StringWrapper1 -> StringWrapper2

一方面,我们想要明确我们传递给这个函数的是StringWrapper1,所以我们不想仅仅治疗StringWrapper1作为类型同义词String(这会导致错误,我自己的经验可以证明)。另一方面,在概念性地构建函数时,我们仍然在某种程度上思考Strings。那么我们要做的就是首先构建func这并不需要我们不断地包装和展开类型:

func :: String -> String

然后,我们使用func建造funcWrapper:

funcWrapper :: StringWrapper1 -> StringWrapper2
funcWrapper (StringWrapper1 str) = StringWrapper2 (func str)

问题/疑问:这是惯用语吗?不断地用一个函数来重复每个函数似乎很尴尬func and a funcWrapper。 Haskell 是否提供了我所缺少的其他方法?或者我应该只使用类型同义词?


正如其他人所说,您应该确保这确实是您想要做的(请参阅 leftaroundabout 的评论)。如果是的话,您可以使用coerce来自标准库 https://hackage.haskell.org/package/base-4.9.0.0/docs/Data-Coerce.html在具有相同运行时表示的类型之间进行转换:

func :: String -> String
func = ...

...

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

在 Haskell 中基于新类型(“包装类型”)构建函数的惯用方法是什么? 的相关文章

  • 如何在递归方案中派生实例

    我正在测试其中的一些想法本文 http blog sumtypeofway com an introduction to recursion schemes 我想派生 Term 类型的 Eq 实例 LANGUAGE DeriveFuncto
  • Haskell:处理死锁的自引用列表

    GHC 允许永久阻止以下内容是否有任何有用的理由 list 1 tail list 看起来列表迭代器 生成器有点复杂 我们应该能够做一些更有用的事情 Return error Infinitely blocking list Return
  • 应用交换律

    带有效果的应用程序编程 http staff city ac uk ross papers Applicative html麦克布莱德和帕特森的论文提出了互换法 u lt gt pure x pure f gt f x lt gt u 为了
  • 使用 Haskell 的欧拉项目 #1

    import Data Set euler Int euler sum x x lt nums where nums Data Set toList Data Set union Data Set fromList 3 6 999 Data
  • 副作用是纯函数中找不到的一切吗?

    可以肯定地说 以下二分法成立 每个给定的函数是 要么纯粹 或有副作用 如果是这样 函数的 副作用就是纯函数中找不到的任何东西 这很大程度上取决于您选择的定义 可以公平地说 函数是pure or impure 纯函数始终返回相同的结果并且不会
  • Haskell,范围缩小到无步骤[重复]

    这个问题在这里已经有答案了 为什么在 Haskell 中工作范围不能降低到没有步骤 7 1 gt 但只工作这个 7 6 1 gt 7 6 5 4 3 2 1 Haskell 无法知道您想要执行 1 除非您给出提示 在某些情况下 您可能需要一
  • 如何在 Haskell 中枚举递归数据类型?

    这篇博文 http lukepalmer wordpress com 2008 05 02 enumerating a context free language 对于如何使用 Omega monad 对角枚举任意语法有一个有趣的解释 他提
  • 谁能解释一下 GHC 对 IO 的定义吗?

    标题非常自我描述 但有一个部分引起了我的注意 newtype IO a IO State RealWorld gt State RealWorld a 剥离newtype 我们得到 State RealWorld gt State Real
  • “反向”使用 Maybe Monad

    假设我有很多功能 f a gt Maybe a g a gt Maybe a h a gt Maybe a 我想按以下方式组合它们 如果 f 返回 Nothing 则计算 g 如果 g 返回 Nothing 则计算 h 如果其中任何一个计算
  • 为什么haskell中的递归列表这么慢?

    我对 Haskell 很陌生 我在 Haskell 中定义了一个函数 febs Integral a gt a gt a febs n n lt 0 0 n 1 1 n 2 1 otherwise febs n 1 febs n 2 但是
  • 列表理解:制作列表列表

    你好 我正在尝试在 haskell 中创建一个函数 该函数接受一个数字 a 使用列表 即数字 将其一部分4它会创造 1 1 1 1 1 1 2 1 3 2 2 4 我正在考虑使用列表理解来创建列表 x 然后使用 1 n 中的数字创建更多列表
  • 如何找到仅是 2、3 和 5 的幂的倍数的所有数字的列表? [复制]

    这个问题在这里已经有答案了 I am trying to generate a list of all multiples which can be represented by the form where a b and c are w
  • 将 Either 列表转换为其中包含列表的 Either 列表

    我是 Haskell 的初学者 我正在编写一些使用 Haskell 的代码Either https hackage haskell org package base 4 9 0 0 docs Data Either html用于错误处理 E
  • 如何将只缓存某些内容的字段添加到ADT?

    我经常需要向 ADT 添加字段 仅记住一些冗余信息 但我还没有完全弄清楚如何又好又高效地做到这一点 说明问题的最好方法是举个例子 假设我们正在使用无类型 lambda 项 type VSym String data Lambda Var V
  • 对元组列表进行排序的函数 - Haskell

    抱歉 这个简单的问题只是我对 haskell 非常陌生 我正在尝试编写一个函数 order 它将对另一个函数 Frequency 生成的元组列表进行排序 频率计算列表中不同元素的数量 a给出一个这样的结果 比如 gt 频率 aabbbccc
  • 反应性香蕉时间延迟

    我已经查阅了文档反应香蕉 http hackage haskell org package reactive banana 而且我找不到指定明确时间延迟的方法 举例来说 我想采取Event t a并将其所有发生的事件移至未来 1 秒 或获取
  • 为什么解析器组合器“seq”用“bind”和“return”定义?

    我正在读这个article http eprints nottingham ac uk 237 1 monparsing pdf关于解析器组合器并且不理解以下内容 他们说使用seq 见下文 导致解析器将嵌套元组作为结果 操作起来很混乱 se
  • 类型级编程有哪些示例? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我不明白 类型级编程 是什么意思 也无法使用Google找到合适的解释 有人可以提供一个演示类型级编程的示例吗 范式的解释和 或定义将
  • Haskell 类型定义,=> 等

    我正在使用 Learn You a Haskell 来学习 Haskell 第 54 页上有一个 像这样执行 take Num i Ord i gt i gt a gt a take n n lt 0 take take n x xs x
  • 为什么以下内容会并行运行而不是顺序运行?

    给定以下函数evalPair parPair and deepSeq分别 evalPair Strategy a gt Strategy b gt Strategy a b evalPair sa sb a b do a lt sa a b

随机推荐

  • hadoop 流:在 EMR 上导入模块

    上一个问题已解决 https stackoverflow com questions 6811549 how can i include a python package with hadoop streaming job 6811775
  • iOS 8 swift 社交框架

    我一直在编写一个应用程序 需要使用社交框架通过 Twitter 和 Facebook 共享文本 我让它工作 但它没有关闭 然后我想起了完成处理程序 但无论我做什么 这个处理程序都会继续给我错误 var okFacebook Bool SLC
  • 在react中读取firestore子集合数据 - 如何在子集合where查询中设置父id

    我正在尝试弄清楚如何从 React 中读取 firestore 子集合数据 我见过这个博客 https dev to rossanodan how to fetch subcollections from cloud firestore w
  • JQuery 添加隐藏的 HTML 元素

    HTML
  • GTK+ 设置字体大小

    As before https stackoverflow com questions 41072683 gtk menuitem size small 菜单项对于我的用例来说太小了 因此 我的问题是 如何增加文本 保存 加载 和 退出 的
  • 选择像素的 4 个邻居[关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 如何选择像素的 4 个邻居matla
  • 如何获取更改前的属性值? (在 QML 中)

    我想了解以下问题 如何在声明式中存储属性的先前值 QML语言 任务是在属性值更改之前将其记住为另一个属性 问题在于现有的信号机制onPropertyNameChanged 该机制在修改后发出有关属性更改的信号 并且在这个处理程序中 不可能获
  • 如何从 java fx 应用程序打开默认系统浏览器?

    我正在尝试从 javafx 在默认系统浏览器中打开一个 web url 我没有找到任何关于此的官方文档 有什么线索吗 编辑 我发现了教程 http blog ngopal com np 2011 02 09 open default bro
  • MySQL DROP 所有表,忽略外键

    有没有一种简单的方法可以从 MySQL 数据库中删除所有表 忽略其中可能存在的任何外键约束 我发现生成的 drop 语句集很有用 并建议进行以下调整 将生成的 drop 限制到您的数据库 如下所示 SELECT concat DROP TA
  • SQL:标记哪个 WHERE 条件匹配

    这是一个理论问题 我想知道是否有一个好的方法来找出 WHERE 语句中的哪个条件匹配 假设我有一个这样的查询 SELECT FROM table WHERE COND1 OR COND2 AND COND3 OR COND4 有什么方法可以
  • pytest:如何创建专用测试目录

    我想要以下项目结构 folder tests project 我们来写一个简单的例子 test pytest tests test sum py t pytest sum py init py 总和 py def my sum a b re
  • JComboBox设置标签和值

    是否可以为a设置一个值和一个标签JComboBox所以我可以显示标签但获得不同的值 例如在 JavaScript 中我可以这样做 document getElementById myselect options 0 value access
  • 添加头文件的 CMake 构建错误 - 致命错误:找不到文件

    我在 Ubuntu 14 04 中使用 CMake 构建 C 源文件 我有一个主要源文件 这包括一个头文件 其中包含另一个源文件中的函数 我的主要源文件是 DisplayImage cpp 头文件是 Camera h 其中包含源文件 Cam
  • Javascript 在分配给其他变量时丢失上下文

    为什么在 javascript 中 如果您将对象方法引用到某个变量 它会丢失该对象上下文 找不到任何链接来解释幕后发生的事情 除了这一篇指出 this 指的是 拥有 该方法的对象 http www sitepoint com what is
  • 在 Android App Bundle 中添加 SwitchCompat 后,找不到资源错误 res/drawable/abc_switch_thumb_material.xml

    我知道这个问题已经被问过好几次了 我已经阅读了所有这些问题 并匹配了所有依赖项 以便它们具有相同的版本 但是这个错误只有在添加 Switch Compat 之后才开始发生 因为您还可以通过查看 Fabric 的崩溃报告来看到这一点 此错误并
  • 尝试启动我的应用程序时出现“没有适当的协议错误”

    我已经使用带有 SSL 证书的 nginx 代理在临时环境和生产环境中成功运行了一个 Spring Boot Web 应用程序几个月了 突然间 昨晚当应用程序尝试发送邮件消息时 当我尝试连接到邮件服务器时 我开始在生产服务器中看到错误 在尝
  • Google Sites API + OAuth2(在 Appengine 上)

    我一直在尝试利用 Python 库来访问 Google Sites API 第一步需要用户授权我们的应用程序 他们建议使用 OAuth2 并且他们提供了一个可以找到的库here http code google com p google a
  • 将桌子分成两半

    无论如何 是否可以使用 CSS 将表格分成两半并并排显示两个部分 例如 采取这个 row1 row1 row1 row2 row2 row2 row3 row3 row3 row4 row4 row4 row5 row5 row5 并做这个
  • 什么是纯 Java [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 我受邀参加 Pure Java Developer 面试 请帮助我理解什么是纯Java 找不到任何有关它的信息 纯Java代码是这样的代码 符合
  • 在 Haskell 中基于新类型(“包装类型”)构建函数的惯用方法是什么?

    Let StringWrapper1 and StringWrapper2是包裹字符串的两种类型 即newtype StringWrapper1 StringWrapper1 String and newtype StringWrapper