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

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(使用前将#替换为@)

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

  • 我该如何实现这个折叠功能呢?

    给出了两种数据类型 颜色 和 植物 data Color Red Pink White Blue Purple Green Yellow deriving Show Eq data Plant Leaf Blossom Color Stal
  • Haskell 标准库是什么?

    GHC专用库可以称为标准库吗 或者只有 Haskell 2010 报告中的那些才算数 许多 GHC 库可以通过 Haskell 报告中的函数来实现 可能与 C 绑定相结合 但其他语言依赖于 GHC 特定的扩展 因为语言报告中定义的当前 Ha
  • Data.Sequence 中的 inits 和 tails 如何工作?

    Louis Wasserman 编写了当前的实现inits and tails in Data Sequence 他表示它们非常高效 事实上 只要查看代码 我就可以看到 无论它们在做什么 它们都是以干净 自上而下的方式进行的 这往往会给惰性
  • 带有 RankNTypes 扩展的奇怪类型推断

    我正在尝试在 Haskell 中尝试 System F 类型 并通过以下方式实现了自然数的 Church 编码type 当加载这段代码时 OPTIONS GHC Wall LANGUAGE RankNTypes type CNat fora
  • 检查对以下内容的理解:“变量”与“变量” “价值”、“功能”与“抽象”

    这个问题是后续问题this one https stackoverflow com questions 25327705 is function a sort of variable 25329157 25329157在学习 Haskell
  • 不同编程语言中的浮点数学

    我知道浮点数学充其量可能是丑陋的 但我想知道是否有人可以解释以下怪癖 在大多数编程语言中 我测试了 0 4 到 0 2 的加法会产生轻微的错误 而 0 4 0 1 0 1 则不会产生错误 两者计算不平等的原因是什么 在各自的编程语言中可以采
  • 执行 Boyer-Moore 模式匹配时是否必须考虑编码?

    我即将实现 Boyer Moore 模式匹配算法的变体 具体来说是星期日算法 我问自己 我的字母表大小是多少 它是否取决于编码 可能的字符数 或者我可以假设我的字母表由 256 个符号组成 一个字节可以表示的符号数 在许多其他情况下 将字符
  • 如何在Haskell中实现词法分析器和解析器

    我在这里得到了这段代码 它是用Haskell结构的命令式编程语言编写的程序 所以问题是 我如何为这种语言实现词法分析器和解析器 该程序被定义为一系列语句有 6 种类型 goto write stop if goto 和 int int n
  • 我是否需要采取明确的操作来促进与持久数据结构的共享?

    我来自命令式背景 正在尝试实现一个简单的不相交集 并集查找 数据结构 以获得在 Haskell 中创建和修改 持久 数据结构的一些练习 目标是有一个简单的实现 但我也关心效率 我的问题与此相关 首先 我创建了一个按等级并集的不相交集森林实现
  • 关于“没有绑定的类型签名”的错误

    我在 Haskell 中遇到 ASCII 问题 fromEnum Char gt Int toEnum Int gt Char offset Int offset fromEnum A fromEnum a toUpper Char gt
  • 如何同时将透镜(或任何其他光学器件)视为吸气剂和设置剂?

    我正在尝试编写一个通用记录更新程序 它允许人们轻松更新记录中的字段existing记录 字段形状相似incoming记录 这是我到目前为止所拥有的 applyUpdater fields existing incoming let gett
  • Parsec.Expr 具有不同优先级的重复前缀

    Parsec Expr buildExpressionParser 的文档说 相同优先级的前缀和后缀运算符只能出现一次 即 如果 为前缀否定 则不允许使用 2 但是 我想解析这样的字符串 具体来说 考虑以下语法 sentence ident
  • 如何使用foldr为列表创建显示实例?

    我想为我的数据类型 我的列表 编写自己的显示实例 到目前为止 我的方法是有效的 但我总是在末尾有一个逗号 我已经尝试用最后一个元素启动折叠并将其从列表中删除 但它很麻烦而且不起作用 有没有更简单的方法来获得正确的解决方案 实际 1 2 3
  • 在 Haskell 中将字符串转换为整数/浮点数?

    data GroceryItem CartItem ItemName Price Quantity StockItem ItemName Price Quantity makeGroceryItem String gt Float gt I
  • Haskell 点运算符

    我尝试在 Haskell 中开发一个简单的平均函数 这似乎有效 lst 1 3 x fromIntegral sum lst y fromIntegral length lst z x y 但是为什么下面的版本不行呢 lst 1 3 x f
  • 如何让 do 块提前返回?

    我正在尝试使用 Haskell 抓取网页并将结果编译到一个对象中 如果出于某种原因 我无法从页面获取所有项目 我想停止尝试处理页面并提前返回 例如 scrapePage String gt IO scrapePage url do doc
  • 管道 - 将多个来源/生产者合并为一个

    我正在使用读取文件sourceFile 但我还需要在处理操作中引入随机性 我认为最好的方法是拥有一个这样的制片人 Producer m StdGen ByteString 其中 StdGen 用于生成随机数 我打算让生产者执行 source
  • 在列表中查找元素及其索引

    我需要让列表的两个元素都满足谓词and这些元素的索引 我可以通过以下方式实现这一点 import Data List findIndices list Int list 3 2 4 1 9 indices findIndices gt 2
  • 并行 Haskell - GHC GC 火花

    我有一个正在尝试并行化的程序 带有可运行代码的完整粘贴here http lpaste net 101528 我进行了分析 发现大部分时间都花在findNearest这本质上是一个简单的foldr超过一个大Data Map findNear
  • Scala 模式匹配打印漂亮

    是否有可能以某种方式编组部分函数 假设它总是只包含一种情况 进入某物人类可读的 假设我们有 Any 类型的集合 消息 List Any 以及使用模式匹配块定义的 PartialFuntion Any T 的数量 case object R1

随机推荐

  • 使用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 之间的随机整数 然后它会提示玩家输入猜测值 输入猜测后 会显示猜