如何从 Haskell 的 read 函数中捕获 no parse 异常?

2024-02-16

在我的 Haskell 程序中,我想使用以下命令读取用户给出的值getLine功能。然后我想使用read函数将此值从字符串转换为适当的 Haskell 类型。我怎样才能捕捉到抛出的解析错误read函数并要求用户重新输入值?

我是否正确地认为这不是“IO 错误”,因为它不是由 IO 系统无法正常运行引起的错误?这是一个语义错误,所以我不能使用IO错误处理机制?


你不想。你想使用reads http://hackage.haskell.org/packages/archive/base/4.0.0.0/doc/html/Text-Read.html#v%3Areads相反,可能是这样的:

maybeRead = fmap fst . listToMaybe . reads

(尽管如果元组的第二个元素不是,您可能想出错"",也就是说,如果还有剩余的字符串)

The reason为什么你想使用读取而不是捕获error异常是纯代码中的异常是邪恶的,因为它是very很容易在错误的地方尝试捕捉它们:请注意,它们只有在被迫时才飞行,而不是之前。找到它的位置可能是一项不简单的工作。这就是(原因之一)Haskell 程序员喜欢保持代码完整,即终止且无异常。

您可能想看看合适的解析框架(例如parsec http://www.haskell.org/haskellwiki/Parsec) and 哈斯凯莱恩 http://hackage.haskell.org/package/haskeline, too.

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

如何从 Haskell 的 read 函数中捕获 no parse 异常? 的相关文章

  • 如何记录所有抛出的异常?

    如何记录抛出和捕获的任何异常 就像 Visual Studio 的 IntelliTrace 所做的那样 或者有没有办法将 InteliTrace 集成到应用程序的调试版本中 然后查看其日志 Update 我会稍微澄清一下 我想要标准 tx
  • Parsec.Expr 具有不同优先级的重复前缀

    Parsec Expr buildExpressionParser 的文档说 相同优先级的前缀和后缀运算符只能出现一次 即 如果 为前缀否定 则不允许使用 2 但是 我想解析这样的字符串 具体来说 考虑以下语法 sentence ident
  • 在 Haskell 中将字符串转换为整数/浮点数?

    data GroceryItem CartItem ItemName Price Quantity StockItem ItemName Price Quantity makeGroceryItem String gt Float gt I
  • 反序列化时出现 Gson 异常(无参数构造函数不存在)

    我遇到了一个问题 该问题仅在 5000 台设备中的 10 台中出现 无法用我的模拟器和测试设备重现它 这似乎是一个非常具体的问题 仅涉及少数设备 我所拥有的只是堆栈跟踪和我的代码 因此 我正在针对黑洞进行开发 只有在 GooglePlay
  • Haskell Fibonacci 达到最大指定数?

    我有一个已启动并正在运行的 Haskell 函数 但它做错了事情 它应该输出最多指定最大数量的斐波那契数列 像这样 fibonacciSequence 86 1 1 2 3 5 8 13 21 33 54 我的代码当前输出斐波那契数列中的前
  • Haskell 中的所有内容都存储在 thunk 中吗,甚至是简单的值?

    以下值 表达式 函数的 thunk 在 Haskell 堆中是什么样子的 val 5 is val a pointer to a box containing 5 add x y x y result add 2 val main prin
  • 索引越界异常

    你好 这段代码将返回indexoutofboundsException我真的不知道为什么 我想从中删除这些对象pointlist它们与中的对象相同list public void listOfExternalPoints List
  • 你将如何在 Haskell 中(重新)实现迭代?

    iterate a gt a gt a gt a 你可能知道 iterate是一个接受函数和起始值的函数 然后它将函数应用于起始值 然后将相同的函数应用于最后的结果 依此类推 Prelude gt take 5 iterate 2 2 2
  • 由于垃圾收集,Haskell 程序中会出现多长时间的暂停?

    关于我的另一个问题Haskell 集合可以保证每个操作的最坏情况范围 https stackoverflow com q 12393104 1333025 我很好奇 垃圾收集会导致多长时间的暂停 Haskell 是否使用某种增量垃圾收集 以
  • 在列表中查找元素及其索引

    我需要让列表的两个元素都满足谓词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
  • 为什么c#异常处理机制不捕获win32异常

    我有一个 winforms 应用程序 Winforms 从 Program cs 开始 我们在其中定义了 main 我已将此代码放在 try catch 块中 STAThread static void Main try Applicati
  • 将 c++ 异常传播到 cython - python 异常

    我的 Cython 0 17 1 有问题 我的函数抛出一个std runtime error如果文件不存在 我想以某种方式将此异常传播到我的 Cython 代码 void loadFile const string filename som
  • 优化 Haskell 内循环

    仍在 Haskell 中进行 SHA1 实现 我现在已经有了一个有效的实现 这是内部循环 iterateBlock Int gt Word32 gt Word32 gt Word32 gt Word32 gt Word32 gt Word3
  • 与 Functor 不同,Monad 可以改变形状?

    我一直很喜欢以下关于单子相对于函子的力量的直观解释 单子可以改变形状 函子不能 例如 length fmap f 1 2 3 总是等于3 然而 对于单子来说 length 1 2 3 gt gt g往往不等于3 例如 如果g定义为 g Nu
  • 如何处理PDO异常[重复]

    这个问题在这里已经有答案了 我正在尝试与PDOphp 上的类 但我在找到处理错误的正确方法时遇到了一些麻烦 我编写了以下代码
  • 如何使用类型系统编码和强制执行合法的 FSM 状态转换?

    假设我有一个类型Thing拥有国有财产A B C 合法的状态转换是A gt B A gt C C gt A 我可以写 transitionToA Thing gt Maybe Thing 这会返回Nothing if Thing处于无法转换
  • Python3中如何使用StringIO?

    我使用的是 Python 3 2 1 无法导入StringIO模块 我用io StringIO它可以工作 但我不能使用它numpy s genfromtxt 像这样 x 1 3 n 4 5 8 numpy genfromtxt io Str
  • Haskell 为替代的 Either 数据类型定义 Functor 实例

    通过 Typeclassopedia 获得一些使用类型类的路由 想要替代Either的一个实例Functor 但即使检查定义Either作为一个例子Functor总是给我带来麻烦 有这个 但不会编译 data Alt a b Success
  • 如何将回溯/sys.exc_info() 值保存在变量中?

    我想将错误名称和回溯详细信息保存到变量中 这是我的尝试 import sys try try print x except Exception ex raise NameError except Exception er print 0 s

随机推荐