首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >具有一元守卫的穷举情况

具有一元守卫的穷举情况
EN

Stack Overflow用户
提问于 2016-07-18 17:46:36
回答 4查看 431关注 0票数 3

我有一个包含相对较多模式的case表达式:

代码语言:javascript
运行
AI代码解释
复制
case x of
  ... -> ...
  ... -> ...
  ... -> ...
  ... -> ...
  ...
  _ -> ...

其中一个箱子有个守卫:

代码语言:javascript
运行
AI代码解释
复制
case x of
  ... -> ...
  ... -> ...
  ... | condition -> ...
    -- If condition is false, fall through to “Rest”.

  -- Rest:
  ... -> ...
  ... -> ...
  ...
  _ -> ...

如果后卫不匹配,我们就继续处理剩下的案子,没问题。但是现在我需要对条件进行单调测试,所以我这样做了:

代码语言:javascript
运行
AI代码解释
复制
case x of
  ... -> ...
  ... -> ...
  ... -> do
    condition <- action
    if condition
      then ...
      else ...  -- How to fall through?

  -- Rest:
  ... -> ...
  ... -> ...
  ...
  _ -> ...

然而,我想我犯了一个错误。似乎没有一种方法可以让else分支继续处理其余的情况,而不复制这些分支或将它们分解到一个函数中。无论哪种方式都会扰乱穷举检查:如果我想在guard后面添加一个case,编译器不知道匹配是否是穷举的。

如何更改此函数,或参数化/包装数据类型,以使用一元保护进行穷举检查?

EN

回答 4

Stack Overflow用户

发布于 2016-07-18 18:14:14

一个简单的选择是获取case代码块的后半部分,并将其放入一个单独的函数中。

代码语言:javascript
运行
AI代码解释
复制
case (x, y) of
  (Foo ..., Foo ...) -> ...
  x@(Bar ..., Bar ...) -> do
    condition <- action
    if condition
    then ...
    else rest x
  x -> rest x

rest (Baz ..., ...) = ...
rest (Var ..., ...) = ...
...
rest _ = undefined

rest的失败案例中使用undefined来捕获您认为应该在原始case块的前半部分中匹配的模式,这有点不令人满意。如果您设法违反了前提条件( (Foo, Foo)等不匹配),那么您将得到一个运行时错误。

票数 3
EN

Stack Overflow用户

发布于 2016-07-18 18:33:33

我不喜欢下面的方法,但无论如何我都会分享它:

代码语言:javascript
运行
AI代码解释
复制
fix (\proceed b -> case (x, y, b) of
  (Foo ..., Foo ..., False) -> ...
  (Bar ..., Bar ..., False) -> do
    condition <- action
    if condition
      then ...
      else proceed True
  (Baz ..., ..., _) -> ...
  (Var ..., ..., _) -> ...
  ...
) False

附加标志b最初为false,因此会考虑所有分支。一旦我们执行proceed,我们将其设置为true,这样就会跳过第一个分支。

根据实际的模式,可能会或可能不会静态地被发现是详尽的。

票数 3
EN

Stack Overflow用户

发布于 2018-04-15 06:05:50

我最终做的是使用配备了Maybe的monad堆栈,并在一系列操作上用asum替换case,遵循以下结构:

代码语言:javascript
运行
AI代码解释
复制
asum

  [ do
    pattern1 <- pure input  -- failed pattern matches fall through
    body1

  , do
    pattern2 <- pure input
    body2

  , do
    pattern1 <- pure input
    guard condition         -- guards also fall through
    body3

  , ...

  ]

正如我最近在this answer中对其他人的问题所描述的那样。不幸的是,这不允许进行详尽的检查。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38442963

复制
相关文章
如何在Linux中创建文件?多个文件创建操作命令。
如果文件file1.txt不存在,则上面的命令将创建该文件,否则,它将更改其时间戳。
用户5005176
2021/08/10
39.4K0
【DB笔试面试511】如何在Oracle中写操作系统文件,如写日志?
可以利用UTL_FILE包,但是,在此之前,要注意设置好UTL_FILE_DIR初始化参数。
AiDBA宝典
2019/09/30
29.2K0
【DB笔试面试511】如何在Oracle中写操作系统文件,如写日志?
VMware 多个产品中爆出严重漏洞
Bleeping Computer 网站消息,VMware 发布警告,称其多个产品中存在关键漏洞,攻击者能够利用这些漏洞发起远程代码执行攻击,用户应该立即修补,以防止遭受网络攻击。
FB客服
2022/04/12
7550
VMware 多个产品中爆出严重漏洞
如何在 iOS 的源码中包含图片?
通过添加这个开源库,笔者 80% 的调试工作都可以用这个库完成,而无需 Xcode 工具。
酷酷的哀殿
2020/10/26
1.5K0
如何在 iOS 的源码中包含图片?
如何在Linux中更改用户ID?
在Linux系统中,每个用户都有一个唯一的用户ID(User ID),用于标识和管理用户的权限和资源访问。有时候,我们需要更改用户ID,可能是为了解决冲突、重组用户组或其他管理需求。本文将详细介绍如何在Linux中更改用户ID的几种方法。
网络技术联盟站
2023/06/08
8.5K0
如何在Linux中更改用户ID?
包含多个矩形的Pblock
Pblock是可以嵌套的,尽管这种应用方式并不常见。嵌套Pblock是为了更细粒度的对相关逻辑进行布局约束。从设计层次角度讲,嵌套的Pblock对应的逻辑单元是父层与子层的关系。
Lauren的FPGA
2019/10/30
1.4K0
如何在 React 中获取点击元素的 ID?
在 React 应用中,我们经常需要根据用户的点击事件来执行相应的操作。在某些情况下,我们需要获取用户点击元素的唯一标识符(ID),以便进行进一步的处理。本文将详细介绍如何在 React 中获取点击元素的 ID,并提供示例代码帮助你理解和应用这个功能。
网络技术联盟站
2023/06/07
3.6K0
如何在PHP中解析XML
XML解析器是一个程序,它可以将XML文档或代码转换为XML文档对象模型(DOM)对象。
Lemon黄
2020/07/07
3.6K0
PHP中DOM操作
//创建一个tag名为people的Element,并添加到DOMDocument中
用户7886150
2021/02/26
8080
USB:根据制造商id及产品id获取产品名
相信很多人都有一个疑问,就是:电脑是怎么知道插入电脑的usb设备的产品名的? 其中一种方法就是,根据usb设备的vendor_id和product_id,然后从数据库中查找产品名称。这种方法可行的原因是,usb设备的制造商id和产品id是由usb组织分配的,因此可以通过这两个id来查数据库,从而获取设备名称。 比如,在DragonOS中,一个USB3设备的设备描述符如下:
灯珑LoGin
2022/10/31
1.3K0
PHP-包含文件
5、包含文件相当于把包含文件中的代码拷贝到主文件中执行,魔术常量除外,魔术常量获取的是所在文件的信息。
cwl_java
2020/03/26
1.3K0
uni-id入门(六)---基础操作(中)
传参为用户名密码 登录成功将token保存为uni_id_token 则请求时会默认携带
代码哈士奇
2021/10/25
8000
uni-id入门(六)---基础操作(中)
如何在 wxPython 中创建多个工具栏
作为C++库wxWidgets的包装器,wxPython允许Python开发人员利用这个成熟且经过实战测试的框架的强大功能。它具有各种平台的本机外观和感觉,包括Windows,macOS和Linux。使用 wxPython,您可以使用各种小部件(例如按钮、文本控件,当然还有工具栏)设计具有视觉吸引力且响应迅速的桌面应用程序。
很酷的站长
2023/08/11
3240
如何在 wxPython 中创建多个工具栏
如何在MySQL现有表中添加自增ID?
当在MySQL数据库中,自增ID是一种常见的主键类型,它为表中的每一行分配唯一的标识符。在某些情况下,我们可能需要在现有的MySQL表中添加自增ID,以便更好地管理和索引数据。在本文中,我们将讨论如何在MySQL现有表中添加自增ID,并介绍相关的步骤和案例。
网络技术联盟站
2023/08/03
2.2K0
如何在MySQL现有表中添加自增ID?
如何在Ansible中复制多个文件和目录
Ansible 通过 copy 和 fetch 模块提供了基本的复制文件和目录的功能.
东风微鸣
2022/04/21
17.4K2
如何在Ansible中复制多个文件和目录
git 将多个commit id 打包成一个或者是多个commit id
我们有时候会出现频繁提交代码的问题,可能多个commit id 实际上一个作用,为了让git log看起来更清晰,我们会将多个commit id 合并成若干个commit id. 这就涉及到git rebase -i. 通过这条命令,我们可以修改git 提交的顺序, 或者是删除某个commit , 修改某个commit 信息, 下面就详细介绍git rebase -i。
张凝可
2019/08/22
1.6K0
点击加载更多

相似问题

Prisma嵌套递归关系深度

16

使用Prisma + MongoDB + GraphQL返回null的嵌套关系

11

具有深嵌套关系的PRISMA - 'where‘

115

如何在prisma查询中创建嵌套连接?

10

如何解决prisma (嵌套列表)中的子选择/关系

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文