读取实例导致解析错误

2024-01-03

我想实现一个 read 实例,使我能够读取字符串(例如:“- - 8 - 3 -”)并构造一个包含这些值的列表。

data Value a = Nul | Val a

showsValue :: (Show a) => Value a -> ShowS
showsValue (Val x) =  ("Value" ++) . shows x
showsValue (Nul)   =  ("Nothing 0" ++)

instance Show a => Show (Value a) where
    showsPrec _ x = showsValue x

instance Read a => Read (Value a) where
    readsPrec _ m = readsMatrix m

readsMatrix :: (Read a) => ReadS (Value a)
readsMatrix ('-':s) = [(Nul, rest) | (' ',rest) <- reads s]
readsMatrix s       = [(Val x,rest)| (x,' ':rest) <- reads s]

执行此测试后:

read "- 8 - - 3" :: Value Int

我收到错误*** Exception: Prelude.read: no parse

我在这里做错了什么?

update

readsMatrix ('-':s) = [(Nul, dropWhile isSpace s)]
readsMatrix s = [(Val x, dropWhile isSpace rest) | (x,rest) <- reads s]

纠正值 a 的读取

首先,不要费心删除空格,这一切都可以很好地处理reads:

readsMatrix :: (Read a) => ReadS (Value a)
readsMatrix ('-':s) = [(Nul, dropWhile (==' ') s)]
readsMatrix s       = [(Val x,rest)| (x,rest) <- reads s] 

您的读取实例现在适合单个值:

*Main> read "4" :: Value Int
Value4
*Main> read "-" :: Value Int
Nothing 0

更正 [值 a] 的读取

但是您想要读取由空格分隔的列表,因此由于这是非标准行为,您需要编写一个自定义readList :: :: ReadS [Value a]

instance Read a => Read (Value a) where
    readsPrec _ m = readsMatrix m
    readList s = [(map read.words $ s,"")]

So now

*Main> read "- 4 2 - 5" :: [Value Int]
[Nothing 0,Value4,Value2,Nothing 0,Value5]

但不幸的是,

*Main> read "- 4 2 \n- 5 4" :: [Value Int]
[Nothing 0,Value4,Value2,Nothing 0,Value5,Value4]

更糟糕的是,

*Main> read "- 4 2 \n- 5 4" :: [[Value Int]]
*** Exception: Prelude.read: no parse

读取矩阵

我认为没有直接的方法来解决这个问题,因为没有readListOfLists in the Read类,那么为什么不创建一个独立的函数

matrix :: Read a => String -> [[Value a]]
matrix = map read.lines

so that

*Main> matrix "3 4 -\n3 - 6\n4 5 -" :: [[Value Int]]
[[Value3,Value4,Nothing 0],[Value3,Nothing 0,Value6],[Value4,Value5,Nothing 0]]

表演不是我会选择的

我认为你的Show实例为Value有点误导(Nul上面没有零,Val没有写Value)。要么写

data Value a = Nul | Val a  deriving Show

使其看起来像原来的样子或定义它以匹配Read实例

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

读取实例导致解析错误 的相关文章

  • 通过 Emacs 评估 ghci 或 Hugs 中的缓冲区

    在 Emacs 中使用 sml mode 我已经能够使用以下命令将缓冲区内容直接发送到较差的 SML 进程C c C b 现在我只想用 Haskell 做同样的事情 Haskell 模式似乎不支持这一点 所以我想知道 使用 Emacs 和
  • 如何在 Yesod 中使用 CSS 框架?

    我想将 Blueprint CSS 框架与 Yesod 一起使用 有没有最佳实践 因为 Yesod 使用 CSS 模板 所以在我看来我不能直接使用 css 文件 我必须将它们重命名为 lucius files 吗 如何将 CSS 添加到 d
  • 类 GADT 类型变量的未来角色?

    A 昨天的问题 https stackoverflow com q 41135212 3072788有一个定义HList 来自HList https hackage haskell org package HList 0 4 1 0 doc
  • 导入 Haskell 模块

    我是哈斯克尔的新手 为什么当我尝试使用时Days from Data Time我收到此错误 Could not find module Data Time It is a member of the hidden package time
  • 如何让 Show 显示函数名称?

    作为一个让我熟悉 Haskell 的简单练习 在 Youtube 上闲逛并偶然进入美国倒计时游戏节目之后 我想为数字游戏制作一个求解器 你得到 6 个数字 需要将它们与 为了得到给定的结果 到目前为止我所得到的是非常脑死亡的 let ope
  • 在 Haskell 中计算移动平均线

    我正在学习 Haskell 所以我尝试实现移动平均函数 这是我的代码 mAverage Int gt Int gt Float mAverage x a fromIntegral k fromIntegral x k lt rawAvera
  • 持久 selectList 导致错误“无法将类型‘BaseBackend backend0’与‘SqlBackend’匹配”

    我遇到以下编译错误 Couldn t match type BaseBackend backend0 with SqlBackend arising from a use of runSqlite The type variable bac
  • 纯函数怎么能做IO呢?

    我最近了解到莫纳德随机数 http hackage haskell org package MonadRandom 0 1 13 docs Control Monad Random Class html t 3aMonadRandom图书馆
  • Haskell 中的分类结构

    Hask通常被认为是一个范畴 其对象是类型 态射是函数 然而 我看到 Conor McBride pigworker 警告不要使用Hask多次 1 https stackoverflow com a 45905082 474311 2 ht
  • Haskell 泛化问题(涉及列表理解)

    假设我想知道a上的所有要点 x y 矩形内的平面has 我可以使用列表推导式来计算 如下所示 let myFun2D x y x lt 0 2 y lt 0 2 现在 如果我想为一个人完成同样的事情 x y z 空间 我可以采取同样的方式并
  • 使用 FoldLine 解析多个块

    对于这个简化的问题 我试图解析一个如下所示的输入 foo bar baz quux woo hoo xyzzy glulx into foo bar baz quux woo hoo xyzzy glulx 我尝试过的代码如下 import
  • 在 Yesod 生态系统中,对某些文本进行 urlencode 的最佳方式是什么?

    我想对一些文本进行 url 编码 例如 用 20 替换每个空格等 我找到了 HTTP Network HTTP Base urlEncode 并且可以使用它 但我想知道是否还有其他通常在 Yesod 生态系统中使用的东西 不幸的是 由于 U
  • Haskell 中的尾递归字符串分割

    我正在考虑分割字符串的问题s在一个字符处c 这表示为 break c s 其中 Haskell 库定义break c 足够接近 br br s h t if c h then s else let h t br t in h h t 假设我
  • 有没有更好的方法将 UTC 时间转换为大纪元时间?

    我想将文件的修改时间设置为从 exif 数据获取的时间 为了从 exif 获取时间 我发现 Graphics Exif getTag Exif gt String gt IO Maybe String 要设置文件修改时间 我发现 Syste
  • QuickCheck是否可以生成任意函数

    我试图为身份编写一个 QuickCheck 测试 f y f y 我最初的计划是编写一个返回函数和整数的任意生成器 具有签名Gen Int gt Int Int 并在prop DollerDoesNothing使用 不使用测试该功能应用程序
  • 如何在不声明新数据的情况下更改类型(String,Int)元组的 Ord 实例?

    我正在尝试对类型列表进行排序 String Int 默认情况下 它按字符串排序 然后按整数排序 如果字符串相等 我希望它是相反的 首先比较整数 然后如果相等则比较字符串 另外 我不想切换到 Int String 我找到了一种通过定义实例来实
  • 管道:多个流消费者

    我编写了一个程序来计算语料库中 NGram 的频率 我已经有一个函数 它消耗一串令牌并生成一个订单的 NGram ngram Monad m gt Int gt Conduit t m t trigrams ngram 3 countFre
  • Haskell Data.Decimal 作为 Aeson 类型

    是否可以解析一个数据 十进制 https hackage haskell org package Decimal 0 4 2 docs Data Decimal html使用 Aeson 包从 JSON 获取 假设我有以下 JSON foo
  • 如何在Haskell中实现词法分析器和解析器

    我在这里得到了这段代码 它是用Haskell结构的命令式编程语言编写的程序 所以问题是 我如何为这种语言实现词法分析器和解析器 该程序被定义为一系列语句有 6 种类型 goto write stop if goto 和 int int n
  • 类型级别集结合律的证明

    我试图证明类型级函数Union https hackage haskell org package type level sets 0 8 5 0 docs Data Type Set html t Union是关联的 但我不确定应该如何完

随机推荐

  • 在 Android 版 Ionic 2 中将推送通知的自定义声音文件放在哪里

    我在 Ionic 2 应用程序中使用推送插件 现在我想使用自定义声音文件 我在有效负载中发送文件名 options data title Title body Body soundname soundfile 但现在我不知道将声音文件放在我
  • 使用 spacy 和 html 突出显示动词短语

    我设计了一个红色字体动词短语的代码并将其输出为 HTML from future import unicode literals import spacy en core web sm import textacy import codec
  • 在排序的 JavaScript 字典中查找前 3 个值条目?

    我有一本已排序的字典 其中包含一定数量的条目 dict B 3 A 2 C 2 D 1 E 0 F 0 有没有什么方法可以过滤字典以查找具有前 3 个最大值的条目 同时考虑重复值 以便输出 output B 3 A 2 C 2 D 1 谢谢
  • 使用 Micronaut 进行多个获取请求参数 @PathVariable 和 @RequestAttribute?

    我的控制器中有一个具有不同参数的 get 函数 我的接口 java public interface MyInterface Get value bob name params surname surname String getMyPar
  • SwiftUI 通知单击转到特定视图

    我正在使用 SwiftUI 2 0 我正在尝试实现 firebase 推送通知 在新的 SwiftUI 应用程序结构中 没有 AppDelegate 和 SceneDelegate 因此我创建了 AppDelegate 类 我设法接收通知
  • Web服务拒绝接收参数并以JSON格式回复

    我正在尝试从 C 应用程序以 json 格式调用 Web 服务 asmx 当我将请求方法指定为 GET 并且不指定 contentType 时 req 是 HttpWebRequest req Method GET 一切正常 但我收到 XM
  • 如何从系统日期中减去年份

    在不硬编码日期的情况下检查某人是否已满 20 岁的表达式是什么 在 SQL 中 SELECT student fname FROM students WHERE dob lt 05 MAR 1995 我正在考虑使用SYSDATE但我不知道减
  • 用于获取某个位置的营业时间的 API?

    是否有任何 API 可以提供特定地点的企业营业时间 Google Places SimpleGeo 和 Yelp 似乎没有公开它 如果没有 是否存在一些可以用来创建这样一个 API 的数据集 同样 我在 data gov 或其他任何地方都找
  • read.table 函数和 stdin

    我有一个制表符分隔的文本文件 我正在尝试使用以下命令将其加载到 R 中 read table功能 脚本的前几行看起来像这样 usr bin env Rscript args lt commandArgs trailingOnly TRUE
  • 在同一域下混合 PHP 和 ASP.NET

    PHP 如何与 ASP NET 混合 假设我在根域下有一个 asp net 应用程序 然后我创建一个文件夹来放置 PHP PHP 可以在 ASP NET 下正常运行吗 我是否有必要将PHP目录转换为IIS7下的应用程序 PHP 已安装 我的
  • 如果 Swing 模型的 getter 不是线程安全的,您如何处理它们?

    众所周知 更新 Swing GUI 必须专门在 EDT 中完成 广告上说的比较少readingGUI 中的操作也必须 应该在 EDT 中完成 例如 我们以ButtonModel 的 isSelected http java sun com
  • 如何为 VR 准备我的游戏? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 假设我们有一些 C OpenGL 游戏 它使用我们自己的渲染引擎 也不是 Unity UE 等 让我们简化我们的问题 例如 我们需要在
  • ASP.NET 页面上的倒计时器

    您能给我推荐一种在 ASP NET 页面上放置倒计时器的方法吗 现在我使用这段代码 默认 aspx
  • URL转义MFC字符串

    如何对 MFC CString 进行 URL 转义 InternetCanonicalizeUrl http msdn microsoft com en us library aa384342 28VS 85 29 aspx
  • 即时 (JIT) 编译器有什么作用?

    与非 JIT 编译器相比 JIT 编译器具体做了什么 有人可以给出一个简洁易懂的描述吗 JIT 编译器运行after程序已启动 并将代码 通常是字节码或某种 VM 指令 即时 或称为即时 编译为通常更快的形式 通常是主机 CPU 的本机指令
  • 从 Cocoa 中的文件中仅读取“N”个字节

    如何从指定文件中只读取 N 个字节 如果您希望以类似于通过 NSData 加载文件的方式随机访问文件内容 但不实际将所有内容读取到内存中 则可以使用内存映射 这样做意味着磁盘上的文件被视为虚拟内存的一部分 并且将像常规虚拟内存一样进行页面调
  • C# 获取嵌入资源的完整路径? [复制]

    这个问题在这里已经有答案了 我正在使用一个 NET 组件 该组件使用一种需要具有完整路径名的字符串的方法来读取特定的二进制文件 如下所示 Read c somefile ext 我已将 somefile ext 作为嵌入式资源放入我的项目中
  • 动态应用内设置

    我有一个应用程序 位置很重要 目前 我在设置包中有一个多值设置 其中定义了 5 个位置 这种方法的问题在于设置包是静态的 也就是说 据我所知 我无法从服务器上的 JSON 列表更新它 我想从服务器上的动态列表更新位置列表 我看过 InApp
  • 共享 SwiftUI 视图的屏幕截图导致崩溃

    我正在抓取 SwiftUI 视图中子视图的屏幕截图 立即传递到共享表以共享图像 该视图是来自呈现为一堆卡片的文本数组的一组问题 我正在尝试获取问题的屏幕截图 并将其与应用程序的链接一起共享 使用愤怒的小鸟的链接进行测试 我基本上可以使用 A
  • 读取实例导致解析错误

    我想实现一个 read 实例 使我能够读取字符串 例如 8 3 并构造一个包含这些值的列表 data Value a Nul Val a showsValue Show a gt Value a gt ShowS showsValue Va