非详尽的模式匹配只是因为我省略了“否则=”? [复制]

2023-12-07

我用 Haskell 写了一个简单的程序来播放《The Rust 编程语言》一书中描述的猜谜游戏:

它的工作原理如下:程序将生成一个 1 到 100 之间的随机整数。然后它会提示玩家输入猜测值。输入猜测后,会显示猜测是否太低或太高。如果猜测正确,游戏将打印祝贺信息并退出。

这是我写的:

import Control.Monad (when)
import System.Random (randomRIO)

-- | Check if the guess is correct, otherwise provide a hint
respond :: Int -> Int -> String
respond correct guess
  | guess > correct = "Smaller than " ++ show guess
  | guess < correct = "Larger than " ++ show guess
  | guess == correct = "Correct! " ++ show correct

-- | Main game loop; prompt for input and repeat until guessed correctly
play :: Int -> IO ()
play x = do
  putStr "Guess: "
  guess <- read <$> getLine
  putStrLn $ respond x guess
  when (guess /= x) $ play x

-- | Start the game with a random number between 1 and 100
main :: IO ()
main = play =<< randomRIO (1, 100)

该代码有效,但 GHC 给了我一个警告"Pattern match(es) are non exhaustive. In an equation for 'respond': Patterns not matched: _ _"

我用这两个下划线代表两个Ints我有作为论据respond功能。我不明白的是我没有涵盖哪种情况。那些不是Maybe Ints 或任何特殊的东西——函数requires两个有效Ints,所以我只需要处理整数——而且我不认为有任何数字不能被视为大于、小于或等于另一个?

这是否只是 GHC 假设我没有涵盖所有情况,因为我没有添加最终的otherwise =警卫?尽管它在逻辑上涵盖了所有情况。


另外,如果您有任何关于如何编写更惯用的 Haskell 的提示,我将不胜感激。我仍在学习基础知识。


GHC 根本不知道其中之一a > b, a < b, or a == b必须评估为True。 (事实上​​,可以写一个Ord违反这一假设的实例——尽管大多数程序员不会考虑这样做,当然也不会考虑这样做Int在这方面会表现得很好。)

您可以通过使用完整的模式匹配来使 GHC 明显看出您已经涵盖了所有情况,例如

respond correct guess = case compare guess correct of
    GT -> ...
    LT -> ...
    EQ -> ...

GHC 的守卫详尽性检查器也有一个特殊情况otherwise and True,因此您可以添加(或替换)其中一个防护装置作为替代解决方案。

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

非详尽的模式匹配只是因为我省略了“否则=”? [复制] 的相关文章

  • 模式匹配 Tkinter 子部件 (winfo_children) 以确定类型

    我正在尝试自动清除所有Entry父小部件中的小部件 import Tkinter import re root Tkinter Tk E1 Tkinter Entry root E1 pack E2 Tkinter Entry root E
  • OpenCV 完美识别物体

    我有一个应用程序 我想一次跟踪 2 个在图片中相当小的对象 该应用程序应该在 Android 和 iPhone 上运行 因此算法应该是高效的 对于我的客户来说 如果我们提供一些模式以及附加到要跟踪的对象的软件 以获得易于识别的目标 那就完全
  • 如何在 TH 拼接中复制 'name 的行为

    考虑这个 Haskell 文件 LANGUAGE TemplateHaskell OPTIONS GHC fplugin Test Inspection Plugin module Text main where import Test I
  • 谁能解释一下 GHC 对 IO 的定义吗?

    标题非常自我描述 但有一个部分引起了我的注意 newtype IO a IO State RealWorld gt State RealWorld a 剥离newtype 我们得到 State RealWorld gt State Real
  • 计算两点之间的距离(Haskell)

    给定两个元组的输入 我希望能够使用以下公式计算两点之间的距离 距离 sqrt x1 x2 2 y1 y2 2 所以我希望函数调用和输出如下所示 gt distance 5 10 3 5 5 385 当我尝试运行下面的代码时 它告诉我输入 w
  • GHC 是否使用存在类型的动态调度?

    下面的代码是否使用了 C 或 Java 中所理解的动态调度 据我了解 在最后一行 编译器不可能在编译时知道要调用哪个 实现 但代码会编译并产生正确的结果 有人可以解释一下 这背后有什么样的实现 例如 vptr 吗 LANGUAGE Exis
  • 图像算法上的物体计数

    我又接到学校任务了 这次 我的老师给我的任务是创建算法来计算图片上有多少只鸭子 该图与此类似 我想我应该使用模式识别来搜索上面有多少只鸭子 但我不知道每只鸭子适合哪种图案 我认为你可以通过分割鸭嘴并计算鸭嘴的数量来解决这个问题连接的组件 h
  • 如何组合过滤条件

    过滤器类函数接受一个条件 a gt Bool 并在过滤时应用它 当您有多个条件时 使用过滤器的最佳方法是什么 使用了应用函数 liftA2 而不是 liftM2 因为出于某种原因我不明白 liftM2 在纯代码中如何工作 liftM2 组合
  • 对元组列表进行排序的函数 - Haskell

    抱歉 这个简单的问题只是我对 haskell 非常陌生 我正在尝试编写一个函数 order 它将对另一个函数 Frequency 生成的元组列表进行排序 频率计算列表中不同元素的数量 a给出一个这样的结果 比如 gt 频率 aabbbccc
  • 存在函数依赖关系时类型推断如何工作

    考虑下面的代码 LANGUAGE MultiParamTypeClasses FlexibleInstances FunctionalDependencies UndecidableInstances FlexibleContexts cl
  • 有什么方法可以在 do / while / let 块中打印出变量的类型吗?

    有没有办法打印出嵌套变量的推断类型ghci 考虑代码 let f g where g x Int x 那么 最好查询一下类型g e g t f g会打印出Int gt Int 您可以通过给出适当的错误类型注释并检查错误消息来诱骗此信息 Ma
  • 使用 Haskell 将函数注入到 Java .class 文件中

    我使用 Haskell 编写了一个 Java 字节码解析器 它工作得很好 然而下一步让我完全难住了 我的 Haskell 程序需要修改 class 文件 以便在执行时 Java 程序打印 输入 此处的方法名称 在执行方法之前 并且 退出 此
  • Scala 和变量中的模式匹配

    我是 Scala 新手 有点想知道模式匹配是如何工作的 想象一下我有以下内容 case class Cls i Int case b Cls i gt Ok case e Cls gt Ok case f Cls gt Ok case s
  • 为什么解析器组合器“seq”用“bind”和“return”定义?

    我正在读这个article http eprints nottingham ac uk 237 1 monparsing pdf关于解析器组合器并且不理解以下内容 他们说使用seq 见下文 导致解析器将嵌套元组作为结果 操作起来很混乱 se
  • 将名称绑定到值与将值分配给变量

    阅读 Bartosz Milewski 的文章完整的 https www fpcomplete com school starting with haskell basics of haskell 3 pure functions lazi
  • 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
  • 如何处理或避免BlockedIndefinitelyOnSTM异常?

    我花了很多时间来解决我正在处理的应用程序中遇到的问题 该应用程序是一个 Web 应用程序 使用 scotty 公开 REST 端点 它使用一个TVar保持其更新的状态STM a由前端层触发的动作 由于该应用程序基于事件溯源原则 因此业务层生
  • Haskell cabal:我刚刚安装了软件包,但现在找不到软件包

    在这里 http haskell org haskellwiki Cabal Install I just installed packages 2C but now the packages are not found这是我可以找到我正在
  • 动态加载编译的 Haskell 模块 - GHC 7.6

    我正在尝试使用 GHC API 动态编译和加载 Haskell 模块 我知道 API 从一个版本到另一个版本波动很大 所以我专门谈论 GHC 7 6 我尝试在 MacOS 和 Linux 上运行相同的代码 在这两种情况下 插件模块都可以正常
  • 如何使用SIFT算法计算两幅图像的相似度?

    我已经用过SIFT http en wikipedia org wiki Scale invariant feature transform实施安德里亚 维达尔迪 http www vlfeat org overview sift html

随机推荐

  • 使用struts2和Ajax下载文件时如何放置进度条

    我无法放置进度条 因为它直接重定向页面并下载文件 这么多问题 其中大部分是隐含的 集中在一个问题中 使用struts2和Ajax下载文件时如何放置进度条 如果不需要 不要使用AJAX下载 当您在浏览器中打开文件时 contentDispos
  • 我们可以在棒棒糖设备中显示旧式时间选择器(Pre Lollipop Time Picker)

    我想在棒棒糖设备中显示较旧的时间选择器 例如棒棒糖设备之前的时间选择器 可以 这个是可以的 您可以通过将 timePickerMode 属性设置为 spinner 来指定微调器样式的时间选择器 材质的默认值为 clock
  • 如何计算相对价值再平衡的 if 语句/错误:“系列的真值不明确”

    下面是我编写的代码 用于计算 df a 和 df b 值的相对变化 而 df 是一个数据帧 基本上需要计算的是df c df a df a iloc df d values df d 设置为等于 df t 如果df a df a iloc
  • JavaScript 什么时候是同步的?

    我一直认为 JavaScript 总是异步的 然而 我了解到有些情况并非如此 即 DOM 操作 关于何时同步 何时异步 是否有一个很好的参考 jQuery 对此有影响吗 JavaScript 始终是同步和单线程的 如果您在页面上执行 Jav
  • PHP Foreach 循环和 DOMNodeList

    我试图确定以 DOMNodeList 集合为种子的 foreach 循环的结束 目前 我正在使用 for 循环 希望避免出现 魔术 数字 我确实知道只有 8 列 但我希望代码对其他应用程序通用 是否可以将其转换为 Foreach 循环 我尝
  • 递归地进行更改:如何修改算法以打印所有组合?

    我有一个算法 可以通过以下方式递归地进行更改 public static int makeChange int amount int currentCoin if amount zero we are at the bottom of a
  • 将包含列表的 pandas 列“unstack”成多行[重复]

    这个问题在这里已经有答案了 假设我有以下 Pandas 数据框 df pd DataFrame a 1 2 3 b 1 2 2 3 4 5 a b 0 1 1 2 1 2 2 3 4 2 3 5 我如何 取消堆叠 b 列中的列表以便将其转换
  • WCF:使用 WsHttpBinding 是否可以互操作?

    顾名思义 现在我正在使用 BasicHttpBinding 但我想知道是否可以切换到 WSHttpBinding 并且仍然可以与 Java 等设备进行互操作 wsHttpBinding 和较新的 ws2007HttpBinding 都实现
  • r for 回归循环 lm(y~x)

    Example df lt data frame A 1 5 B 2 6 C 3 7 D 4 8 E 5 9 F 6 10 我想使用像 y 一样的列 1 和 2 以及像 x 一样的其余列来制作回归循环 lm y x my idea lmf
  • 将动态生成的列表中的数据从一个页面传递到另一页面

    在我的 jquery 移动应用程序中 我有一个动态生成的列表视图 我想要做的是当用户单击列表项时 我想从列表项中的隐藏字段获取一个值并将该值传递到另一个页面 以便我可以根据该变量值进行查询 这是多页布局 由于我与第一页位于同一 DOM 中
  • 如何在android中制作通话记录应用程序

    我是一名 android 新手程序员 我想制作一个 android 应用程序来记录电话活动 例如来电 去电或未接来电 并将日志记录到文件 txt 我应该怎么办 请帮我 看一眼通话记录 通话 以下是一些有关使用通话记录的好教程 android
  • 当 JSONP 和 CORS 等解决方法存在时,为什么浏览器有同源策略?

    这个问题有点重复 为什么 XMLHttpRequest 的同源策略 然而 这个答案并不令人满意 因为它没有解决存在解决方法的事实 如问题中所述 答案仅解决与 XMLHttpRequest 直接相关的安全问题 但 JSONP 仍然存在这些问题
  • jquery 一对一切换多个div

    我想做的是在不同的 div 之间切换 这有点难以解释 但我会尝试一下 当页面加载时 将有一个可见的 div 和 4 个带有 display none 的 div 会有一个菜单 链接 1 将显示第一个 div 并隐藏所有其他 div 然后 当
  • Swift 中按属性对类或结构数组进行排序的通用函数

    我想创建一个通用函数来根据传递的属性对类数组进行排序 例如 我有这些课程 public class Car var id Int var manufacturer String var variant String init id Int
  • JPA、SQlite没有这样的表:SEQUENCE

    我对 JPA 和 SQlite 有疑问 我已经从表创建了一个实体 我生成的实体如下所示 Entity Table name sqliteTestTable public class Test implements Serializable
  • 相同代码中的行为不一致

    运行物理模拟大约 20 分钟后会出现错误陷阱 意识到这对于调试来说是一件痛苦的事情 我在一个新项目中复制了相关的子例程 并在错误发生时使用原始输入数据的硬编码副本来调用它 但错误陷阱并没有跳出来 经过两天繁琐的工作来隔离子例程的两个实例的行
  • 将文本从 Firefox WebExtension 中的后台脚本复制到剪贴板

    我正在将 Chrome 扩展程序移植到 Firefox 它具有粘贴到剪贴板的功能 但是 我还没有在 Firefox 中做到这一点 这是我在后台脚本中尝试执行的操作 const input document createElement tex
  • 为什么我的序言规则陷入无限递归

    我的代码可以达到其预期目的 但最后总是陷入循环 给出错误消息 超出堆栈限制 我的代码如下 byCar auckland hamilton byCar hamilton raglan byCar valmont saarbruecken by
  • Javascript 脚本在表单输入中查找乱码

    我需要一个脚本或正则表达式 我将使用 Javascript jQuery 来检查网站上的表单输入 来检查是否有人输入了大部分是乱码的单词 正常的单词或句子应该通过测试 This is a normal sentence pass Peter
  • 非详尽的模式匹配只是因为我省略了“否则=”? [复制]

    这个问题在这里已经有答案了 我用 Haskell 写了一个简单的程序来播放 The Rust 编程语言 一书中描述的猜谜游戏 它的工作原理如下 程序将生成一个 1 到 100 之间的随机整数 然后它会提示玩家输入猜测值 输入猜测后 会显示猜