如何确定一个枚举值是否是另一个枚举值的后继?

2024-01-18

我正在尝试编写一个函数来告诉我是否Enum是另一个人的继承者。这是我的第一次尝试:

isSuccessorOf x y = x == succ y

看起来很合理。我们来尝试一下:

λ> isSuccessorOf 3 2
True
λ> isSuccessorOf 1 5
False
λ> isSuccessorOf 3 (maxBound :: Int)
*** Exception: Prelude.Enum.succ{Int}: tried to take `succ' of maxBound

哎呀。那应该是False。让我们确保我们不会尝试做succ maxBound:

isSuccessorOf x y = y /= maxBound && x == succ y

让我们再试一次:

λ> isSuccessorOf 3 (maxBound :: Int)
False
λ> isSuccessorOf 3 (2 :: Integer)
<interactive>:2:1: error:
    • No instance for (Bounded Integer)
        arising from a use of ‘isSuccessorOf’
    • In the expression: isSuccessorOf 3 (2 :: Integer)
      In an equation for ‘it’: it = isSuccessorOf 3 (2 :: Integer)

嗯,现在它只适用于有界类型。我想避免需要单独的无界和有界函数Enums,特别是如果编译时没有任何东西可以阻止您在有界类型上使用无界函数。让我们使用一个Ord约束代替:

isSuccessorOf x y = x > y && x == succ y

让我们尝试一下:

λ> isSuccessorOf 3 (maxBound :: Int)
False
λ> isSuccessorOf 3 (2 :: Integer)
True

但现在我做出了一个毫无根据的假设。让我们再尝试一件事(注意:这取决于Down有一个Enum实例,仅在 GHC 8.10 中具有):

λ> import Data.Ord (Down(..))
λ> let delisleFreezing = Down 150
λ> isSuccessorOf (succ delisleFreezing) delisleFreezing
False

嗯,这不太理想。

那么有没有什么方法可以完成这个看似简单的任务,而又不存在这三个缺陷之一呢?

  • 无法编译不存在的类型Bounded
  • 类型的底部是Bounded
  • 对于其中的类型给出错误的答案succ x > x不成立

也许更安全的检查方法是利用enumFromTo https://hackage.haskell.org/package/base-4.14.0.0/docs/Prelude.html#v:enumFromTo,并检查列表的第二项是否是我们正在寻找的后继项。我们可以像you say https://stackoverflow.com/questions/61688753/how-can-i-determine-if-one-enum-value-is-the-successor-of-another/61688937#comment109118183_61688937,简单地对包含两个元素的列表进行模式匹配,我们不需要检查第二个元素是否确实是y:

isSuccessorOf :: Enum a => a -> a -> Bool
isSuccessorOf y x
    | [_,_] <- [x .. y] = True
    | otherwise = False

或者我们可以,比如@chi 说 https://stackoverflow.com/questions/61688753/how-can-i-determine-if-one-enum-value-is-the-successor-of-another#comment109118049_61688753用它来查看是否有后继者:

succMaybe :: Enum a => a -> Maybe a
succMaybe x = case [x ..] of
    (_:z:_) -> Just z
    _ -> Nothing
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何确定一个枚举值是否是另一个枚举值的后继? 的相关文章

随机推荐

  • 查找范围内缺失的日期 (php)

    我想识别 PHP 数组中缺失的日期 例如 这个范围 2013 06 12 2013 06 13 2013 06 26 2013 06 27 2013 06 29 缺少以下日期 2013 06 14 2013 06 15 2013 06 16
  • 如何删除数组中最后一个逗号和空格? Java [重复]

    这个问题在这里已经有答案了 伙计们 我想知道如何从数组中删除多余的逗号和空格 当我运行该程序时 它给我 1 2 3 4 5 我想要的是 1 2 3 4 5 主要必须保持不变 PrintArray 方法是我需要帮助的方法 参考重复的问题陈述
  • 如何从 iPhone (swift) 应用程序打开 WhatsApp?

    我在用webview对于我的 Swift 应用程序 我有 Share on WhatsApp 我的网站上的按钮在浏览器上运行良好 但在 iPhone 应用程序上 当我点击按钮时 没有任何反应 如何从我的应用程序打开 WhatsApp 我在用
  • 何时通过服务引用使用 WCF ChannelFactory [重复]

    这个问题在这里已经有答案了 我正在浏览 WCF 教程 发现这些教程指出我需要提供一个 mex 端点 以允许隐式向客户端添加服务引用 我想这允许 VS 在使用生成的 WSDL 文件时创建代理类 然而 我试图熟悉的代码库不使用隐式服务引用 相反
  • 将数据从表单提交到 django 视图

    当我打开 html 文件时 它会按预期显示 当我在文本框中输入数据并提交时 它会将我重定向到localhost myapp output 但为什么我在文本框中输入的数据没有提交 例如localhost myapp output data I
  • EclipseLink、EntityManager 需要两个持久性单元

    我有一个 jar 库 A 或 eclipse 中的项目 它有自己的持久性单元 META INF persistence xml 和一些实体类 以及使用该库的另一个项目 B 在项目 B 中还有持久化单元和实体类 在项目 B 中 我需要使用项目
  • 嵌入、对象和视频标签之间的区别?

    据我所知 我知道embed tag用于嵌入来自 youtube 等网站的视频 object tag适用于 Flash 视频和video tags受到HTML5 但我很好奇这些标签的深入细节 以及作为一名开发人员 应该在哪里使用哪个标签 em
  • SSRS - 后续页面内容区域中标题和 tablix 之间的空格/边距

    好吧 我知道这个问题很难消化 所以我希望这张附图能让我的问题更有意义 基本上我想在第一页之后在标题和 tablix 之间保留一些空间 我对标题使用底部边框 用户不希望看到表格和标题粘在一起 尝试放置空文本框 隐藏 但实际上不起作用 因为我无
  • django 错误无法导入名称“RemovedInDjango30Warning”

    伙计们 我对 Django 相当陌生 我刚刚开始从事一个个人项目 并决定滥用 pycharm 我认为它与错误有关 或不相关 当我跑步时python manage py runserver我收到下面发布的错误 我做了一些谷歌搜索 看起来它是由
  • C++中的vtable是什么[重复]

    这个问题在这里已经有答案了 可能的重复 为什么我需要虚拟表 https stackoverflow com questions 3004501 why do i need virtual table C 中的 vtable 是什么 到目前为
  • 纯虚函数调用

    我正在使用 boost python 来制作用 C 编写的 python 模块 我有一些带有纯虚函数的基类 我已将其导出如下 class Base virtual int getPosition 0 boost python class B
  • 如何在 elm 中按索引获取列表项?

    我有一个清单 现在我想要第 n 项 在哈斯克尔我会使用 但我找不到它的榆树变体 Elm 添加了数组0 12 1 http elm lang org blog announce 0 12 1 elm 并且在 0 19 中对实现进行了大规模修改
  • 如何在 Microsoft Access 中通过 VBA 设置 INSERT SQL 查询的参数值?

    我是 Access 新手 之前使用过 C SQL Server 和 Net 我有一个项目正在进行 我必须完成一些部分 该场景可以描述为 带有子表单的 Access 表单 一个Access查询 即上述子表单的数据源 有两个参数 显示为 Par
  • 使用 SyndicateFeed 读取 SyndicateItem 中的非标准元素

    在 net 3 5 中 有一个 SyndicateFeed 可以加载 RSS 提要并允许您在其上运行 LINQ 以下是我正在加载的 RSS 示例
  • 谷歌云端点返回 java long 作为 JSON 中的字符串

    我正在使用 google app engine 最新版本 1 9 30 我定义我的云端点如下 Api name app version v1 transformers EndpointDateTransformer class public
  • 如何在 IE 10/11 中可靠地将 XML 转换为字符串?

    当使用 jQuery 解析 XML 并将其转换回字符串时 IE 10 和 IE 11 未正确保留命名空间 除了编写我自己的 stringify 代码之外 还有其他可接受的方法可以在 IE 10 11 中执行此操作吗 这是我正在使用的代码 我
  • 直线和球体之间的交点

    我试图找到球体和直线之间的交点 但老实说 我不知道该怎么做 有人能帮我解决这个问题吗 将直线表示为函数t x t x0 1 t t x1 y t y0 1 t t y1 z t z0 1 t t z1 When t 0 它将在一个终点 x0
  • 多行文本框根据文本量自动调整其高度

    我有一个文本框 可以返回长度从 5 个字符到 1000 个字符的各种字符串 它具有以下属性 多行 真 自动换行 true 我需要设置文本框的哪些其他属性才能实现以下操作 盒子的宽度应该是固定的 根据返回的文本量自动调整框的高度 例如 如果文
  • 具有绝对/固定子项的父容器的自动高度

    我试图为包含 2 个子元素的 div 设置自动高度 分别固定和绝对定位 我希望我的父容器具有自动高度 但我知道这很难 因为子元素及其位置从页面结构中取出 我尝试为我的父 div 设置一个有效的高度 但是由于我的布局是响应式的 当它缩小到移动
  • 如何确定一个枚举值是否是另一个枚举值的后继?

    我正在尝试编写一个函数来告诉我是否Enum是另一个人的继承者 这是我的第一次尝试 isSuccessorOf x y x succ y 看起来很合理 我们来尝试一下 gt isSuccessorOf 3 2 True gt isSucces