Haskell - 简单构造函数比较(?)函数

2024-02-11

在我的项目中,我创建了一种数据类型,它可以保存几种类型的值之一:

data PhpValue = VoidValue | IntValue Integer | BoolValue Bool

我现在想做的是有一种简单的方法来检查两个值是否PhpValue类型具有相同的构造函数(如果我对这里的术语感到困惑,请纠正我,但基本上我想检查两者是否是,例如IntValue,而不关心特定值)。

这是我为此编写的一个函数:

sameConstructor :: PhpValue -> PhpValue -> Bool
sameConstructor VoidValue VoidValue = True
sameConstructor (IntValue _) (IntValue _) = True
sameConstructor (BoolValue _) (BoolValue _) = True
sameConstructor _ _ = False

这可以正常工作,但我真的不喜欢它:如果我添加更多构造函数(例如FloatValue Float)我将不得不重写该函数,并且随着我的数据定义变大,它也会变大。

问题:有没有一种方法可以编写这样的函数,以便当我添加更多构造函数时它的实现不会改变?

郑重声明:我不想改变data定义,我的其余代码中有足够的 Monad;)


看一眼Data.Data和它的toConstr功能。这将返回构造函数的表示形式,可以比较其是否相等。

使用扩展名(您可以将{-# LANGUAGE DeriveDataTypeable #-}在模块的顶部),您可以有一个Data自动为您派生实例:

data PhpValue = VoidValue | IntValue Integer | BoolValue Bool 
              deriving (Typeable, Data)

然后您应该能够使用toConstr通过构造函数进行比较的函数。

现在以下情况将成立:

toConstr (BoolValue True) == toConstr (BoolValue False)

Using on from Data.Function你现在可以重写sameConstructor to:

sameConstructor = (==) `on` toConstr

这与

sameConstructor l r = toConstr l == toConstr r

我认为使用的版本on更容易一目了然地阅读。

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

Haskell - 简单构造函数比较(?)函数 的相关文章

  • Traversable 类型类的用途

    有人可以向我解释一下类型类的目的是什么吗Traversable 类型类定义是 class Functor t Foldable t gt Traversable t gt where So Traversable is a Functor
  • 有没有更好的方法将 UTC 时间转换为大纪元时间?

    我想将文件的修改时间设置为从 exif 数据获取的时间 为了从 exif 获取时间 我发现 Graphics Exif getTag Exif gt String gt IO Maybe String 要设置文件修改时间 我发现 Syste
  • 如何在haskell中获取变量名称

    我来到 haskell 时有一些 c 背景知识 想知道是否有类似的 define print a printf s d n a a int a 5 print a 应该打印 a 5 这是 augustss 提到的 TH 解决方案 LANGU
  • 找不到模块“Yesod”

    我有以下代码 LANGUAGE TypeFamilies QuasiQuotes MultiParamTypeClasses TemplateHaskell OverloadedStrings module Simple where imp
  • Haskell:IORef 的性能

    我一直在尝试在 Haskell 中编码一个需要使用大量可变引用的算法 但与纯粹的惰性代码相比 它 也许并不奇怪 非常慢 考虑一个非常简单的例子 module Main where import Data IORef import Contr
  • 带有 RankNTypes 扩展的奇怪类型推断

    我正在尝试在 Haskell 中尝试 System F 类型 并通过以下方式实现了自然数的 Church 编码type 当加载这段代码时 OPTIONS GHC Wall LANGUAGE RankNTypes type CNat fora
  • Haskell:不在范围内:数据构造函数

    今天开始在学校学习 haskell 我遇到了函数问题 我不明白为什么它不在范围内 代码如下 ff Char gt Char gt Char ff A B x 0 y 1 x lt A y lt B x 1 y 0 和错误 md31 hs 2
  • 管道:多个流消费者

    我编写了一个程序来计算语料库中 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
  • 如何更换HXT中的节点?

    给定一个示例 xml 文件
  • 纯 Haskell 代码需要线程池吗?

    In 现实世界 Haskell 第 28 章 软件事务内存 http book realworldhaskell org read software transactional memory html 开发了一个并发网络链接检查器 它获取网
  • Haskell 项目可以使用 cmake 吗?

    我正在计划一个用 Haskell 编写的项目 也许也有一些部分是用 C 编写的 对于构建系统 我决定不选择 Haskell 程序 cabal 的常见选择 主要是因为我想了解其他语言的构建程序是如何工作的 我听说过 CMake 我认为这是一个
  • Haskell 处理负参数

    尝试对两个值求和 其中只有一个为负值 例如 1 and 2 soma Float gt Float gt Float soma x1 x2 x1 x2 结果出现错误 为什么
  • 如何同时将透镜(或任何其他光学器件)视为吸气剂和设置剂?

    我正在尝试编写一个通用记录更新程序 它允许人们轻松更新记录中的字段existing记录 字段形状相似incoming记录 这是我到目前为止所拥有的 applyUpdater fields existing incoming let gett
  • 在 Haskell 中将字符串转换为整数/浮点数?

    data GroceryItem CartItem ItemName Price Quantity StockItem ItemName Price Quantity makeGroceryItem String gt Float gt I
  • 我可以从 GHCi 中找到 GHC 版本吗?

    gt 我在里面输入什么GHCi发现它正在使用哪个 GHC 版本 gt import System Info gt browse arch String compilerName String compilerVersion Data Ver
  • 如何从具有函数依赖关系的类型类中获取和使用依赖类型?

    如何从具有函数依赖关系的类型类中获取和使用依赖类型 为了澄清并给出我最近的尝试的一个例子 从我正在编写的实际代码中最小化 class Identifiable a b a gt b where if you know a you know
  • Haskell / cabal 包的解决方法受到 Nix 和 Cabal 的限制?

    我最近开始开发反射平台 https github com reflex frp reflex platform 有一些额外的配置类似于优秀的反射项目骨架 https github com ElvishJerricco reflex proj
  • 如何与更高级别的类型合作

    玩弄教堂的数字 我遇到了无法指导 GHC 类型检查器处理高阶类型的情况 首先我写了一个版本 没有任何类型签名 module ChurchStripped where zero z z inc n z s s n z s natInteger
  • 在ghci中,如何删除现有的绑定?

    我收到一个 绑定影响现有绑定 错误 类似于以下错误this https stackoverflow com questions 2902716 in haskell what does it mean if a binding shadow

随机推荐

  • 使用 mysql2pgsql 将数据库从 MySql 传输到 Postgres 时出错

    为了在 Heroku 上托管我的 Python Django 应用程序 我尝试按照以下说明将我的数据库从 MySQL 转换为 Postgreshttps realpython com blog python migration your d
  • 如何将 Map[CustomType, String] 序列化为 JSON

    鉴于以下情况Enumeration object MyEnum extends Enumeration type MyEnum Value val Val1 Value val1 val Val2 Value val2 val Val3 V
  • 如何使用 CodeIgniter 在 SQL Server 数据库中存储多字节字符

    我正在将 MS SQL Server 和 CodeIgniter 2 与 Active Record 用于我正在从事的一个项目 我偶然发现了这个问题 当我提交包含中文或印地语字符的表单时 我将其存储在表格中 当我查看它时 我得到的只是问号
  • 显示其他属性值(如果 django 模板中已知)

    我在 django 中有这个应用程序 我正在尝试制作 这是index html页面 h1 Choose the name of student h1
  • 在 C# 中将 lambda 函数作为命名参数传递

    编译这个简单的程序 class Program static void Foo Action bar bar static void Main string args Foo gt Console WriteLine 42 那里没什么奇怪的
  • 使用 Simple Injector 注册 FluentValidation 的正确方法是什么?

    我可以注册 FluentValidationAbstractValidators用一个FluentValidatorFactory 然而 它并没有feel是的 因为并非所有 IoC 容器注册都发生在引导 组合根期间 相反 The 成分根 p
  • 创建表格时如何提高 iText 性能

    嘿 很棒的 Stackoverflow 人 我目前正在评估我们是否应该使用 iText 7 1 9 for Java 还是 C 为此 我创建了一个测试用例 其中我编写了一个包含一堆页面的 PDF 每个页面都包含一个大表格 代码如下 在 Ja
  • 堆栈里面有什么?

    如果我运行一个程序 就像 include
  • 使用 JavaScript 上传文件夹及其所有内容

    如何使用 JavaScript 客户端 上传文件夹的内容 FileSystem API尚未被Chrome以外的浏览器采用 我只得到一个带有文件夹名称的文件项 这应该是可能的 因为 Google Drive 允许删除文件夹 所有内容 文件夹和
  • 为视频添加标签

    我必须编写一个简单的视频播放器 可以在特定时间显示一些字幕 链接或图片 如 YouTube 上的图片 我不知道如何使用 QVideoWidget 显示任何内容 我找不到任何有用的课程来做到这一点 您能给我一些建议吗 我按照你的方式做了 但是
  • 更改数据框的列类型

    我有一个包含大量值的数据框 数据框如下 gt datedPf date ticker quantity 96828 2013 01 11 ABT 700 96829 2013 01 11 AMD 9600 96830 2013 01 11
  • Android删除SIM卡联系人的方法

    下面是我从手机中删除联系人的代码 Uri contactUri Uri withAppendedPath PhoneLookup CONTENT FILTER URI Uri encode phone Cursor cur mContext
  • 单击外部链接时更改谷歌地图标记图标?

    我有一个谷歌地图 上面有很多标记 从 MySQL 数据库收集 我当前正在使用以下代码在单击标记时更改标记的图标 var redbikeicon images bike red png marker new google maps Marke
  • 即时应用程序功能模块中的资源合并

    在即时应用程序功能模块中 我导入一个 aar 使用来自 Maven 存储库的 api 语句 其中包含其清单中的活动声明以及此声明中使用的 样式 资源 由于在基本功能项目中找不到样式资源 因此清单合并失败 功能模块中导入的 aar 的资源似乎
  • IE 11 添加类 + 删除类

    我无法让此代码在 Internet Explorer 11 上运行 我知道此段导致了问题 如果我在激活此代码的情况下上传文件 IE 11 会将我网站的整个部分完全显示为空白 没有它 它会在我的网站上显示信息 但它的功能显然不一样 我查过各种
  • select2 动态改变项目

    我有两个链接的选择 第一个选择的每个值决定哪些项目将显示在第二个选择中 第二个选择的值存储在二维数组中 id 1 text a id 2 text b id 1a text aa id 1b text ba 第一个选择值确定用于填充第二个选
  • LDA Mallet 调用进程错误

    我正在尝试实现以下代码 import os os environ update MALLET HOME r c mallet 2 0 8 mallet path C mallet 2 0 8 bin mallet ldamallet gen
  • seasonal_decompose:操作数无法与系列上的形状一起广播

    我知道关于这个话题有很多问题 但没有一个能帮助我解决这个问题 我真的很坚持这个 用一个简单的系列 0 2016 01 31 266 2016 02 29 235 2016 03 31 347 2016 04 30 514 2016 05 3
  • 带有外部图像的 box2d-js 元素

    到目前为止 在各种 box2d js 实现的示例中 我只能找到形状 球 盒子 等 中定义的元素 有没有办法创建由图像定义的元素 例如一块巨石 您可以使用b2PolyDef and b2PolyShape对象来创建多边形 本文档 http w
  • Haskell - 简单构造函数比较(?)函数

    在我的项目中 我创建了一种数据类型 它可以保存几种类型的值之一 data PhpValue VoidValue IntValue Integer BoolValue Bool 我现在想做的是有一种简单的方法来检查两个值是否PhpValue类