如何使用检查器测试此应用实例? (没有 CoArbitrary 实例(验证 e0 [Char]))

2023-12-01

Checkers是一个可重用 QuickCheck 属性的库,特别是 标准类型类

如何编写一个检查器实例来测试我的验证应用实例是否有效?

import Test.QuickCheck
import Test.QuickCheck.Checkers
import Test.QuickCheck.Classes
import Control.Applicative
import Data.Monoid

data Validation e a =
  Error e
  | Scss a
  deriving (Eq, Show)

instance Functor (Validation e) where
  fmap _ (Error e) = Error e
  fmap f (Scss a) = Scss $ f a

instance Monoid e => Applicative (Validation e) where
  pure = Scss
  (<*>) (Scss f) (Scss a) = Scss $ f a
  (<*>) (Error g) (Scss a) = Error g
  (<*>) (Scss a) (Error g) = Error g
  (<*>) (Error a) (Error g) = Error $ mappend a g

instance (Arbitrary a, Arbitrary b) => Arbitrary (Validation a b) where
  arbitrary = do
    a <- arbitrary
    b <- arbitrary
    elements [Scss a, Error b]

instance (Eq a, Eq b) => EqProp (Validation a b) where (=-=) = eq

main :: IO ()
main = quickBatch $ applicative [(Scss "b", Scss "a", Scss "c")]

我想我已经快到了,但是我收到了如下错误:

chap17/Validation_applicative.hs:36:21: No instance for (CoArbitrary (Validation e0 [Char])) …
      arising from a use of ‘applicative’
    In the second argument of ‘($)’, namely
      ‘applicative [(Scss "b", Scss "a", Scss "c")]’
    In the expression:
      quickBatch $ applicative [(Scss "b", Scss "a", Scss "c")]
    In an equation for ‘main’:
        main = quickBatch $ applicative [(Scss "b", Scss "a", Scss "c")]
Compilation failed.

我尝试添加 CoArbitrary 实例进行验证,如下所示:

instance CoArbitrary (Validation a b)

但这会导致此错误消息:

chap17/Validation_applicative.hs:35:10: No instance for (GHC.Generics.Generic (Validation a b)) …
      arising from a use of ‘Test.QuickCheck.Arbitrary.$gdmcoarbitrary’
    In the expression: Test.QuickCheck.Arbitrary.$gdmcoarbitrary
    In an equation for ‘coarbitrary’:
        coarbitrary = Test.QuickCheck.Arbitrary.$gdmcoarbitrary
    In the instance declaration for ‘CoArbitrary (Validation a b)’
chap17/Validation_applicative.hs:38:21: No instance for (Eq e0) arising from a use of ‘applicative’ …
    The type variable ‘e0’ is ambiguous
    Note: there are several potential instances:
      instance Eq a => Eq (Const a b) -- Defined in ‘Control.Applicative’
      instance Eq a => Eq (ZipList a) -- Defined in ‘Control.Applicative’
      instance Eq a => Eq (Data.Complex.Complex a)
        -- Defined in ‘Data.Complex’
      ...plus 65 others
    In the second argument of ‘($)’, namely
      ‘applicative [(Scss "b", Scss "a", Scss "c")]’
    In the expression:
      quickBatch $ applicative [(Scss "b", Scss "a", Scss "c")]
    In an equation for ‘main’:
        main = quickBatch $ applicative [(Scss "b", Scss "a", Scss "c")]
Compilation failed.

How to

自动派生实例CoArbitrary,您的数据类型应该有一个实例Generic,它又可以通过一些很好的语言扩展自动导出:

{-# LANGUAGE DeriveGeneric #-}

import           GHC.Generics

data Validation e a =
  Error e
  | Scss a
  deriving (Eq, Show, Generic)

然而,你的程序中最严重的错误是你正在测试[]但不是你自己的类型applicative [(Scss "b", Scss "a", Scss "c")]。这是定义applicative测试包,详细信息省略:

applicative :: forall m a b c.
               ( Applicative m
               , Arbitrary a, CoArbitrary a, Arbitrary b, Arbitrary (m a)
               , Arbitrary (m (b -> c)), Show (m (b -> c))
               , Arbitrary (m (a -> b)), Show (m (a -> b))
               , Show a, Show (m a)
               , EqProp (m a), EqProp (m b), EqProp (m c)
               ) =>
               m (a,b,c) -> TestBatch
applicative = const ( "applicative"
                    , [ ("identity"    , property identityP)
                      , ("composition" , property compositionP)
                      , ("homomorphism", property homomorphismP)
                      , ("interchange" , property interchangeP)
                      , ("functor"     , property functorP)
                      ]
                    )

简而言之,给定四种类型m, a, b and c,这个函数将创建一堆属性m-- 作为一个应用函子 -- 应该满足,稍后你可以用随机测试它们a b c产生的值QuickCheck. [(Scss "b", Scss "a", Scss "c")]有类型[(Validation String, Validation String, Validation String)] makes m ~ [].

所以你应该提供一些类型的值Validation e (a, b, c),或者根本没有值:您可能已经注意到const就在定义中applicative,只有参数的类型很重要:

main :: IO ()
main = quickBatch $ applicative (undefined :: Validation String (Int, Double, Char))

之后,您可以运行测试并获得格式正确的结果。但是不,您不应该以这种方式测试应用程序。


为什么不应该

测试由提供checkers还远远不够。根据 GHC 的运行时单态性质及其处理歧义的方式,您必须提供四种具体的非多态类型来运行测试,例如Validation String (Int, Double, Char),测试模块将仅生成并测试这四种类型,而您的应用函子应该适用于满足上下文的任何类型。

IMO 大多数多态函数都不太适合单元测试框架:它无法针对所有可能的类型进行测试,因此必须选择要么仅使用手动选择的类型进行一些测试,要么对通用类型进行测试足够(就像 Free monad,当你的代码需要任意 monad 时,但通常“足够通用”在其他上下文中没有得到很好的定义)。

您最好严格检查您的实现,并证明所有情况下都满足所有法律,无论是用纸笔还是用 agda 等证明引擎。这是一个关于Maybe这可能有帮助:证明组合律可能适用


编辑:请阅读评论。我不完全理解,但这意味着Integer是用于单元测试多态函数的“足够通用”的类型。我发现Bartosz Milewski 的这篇博客文章及其参考书目是掌握参数性和自由定理思想的良好资源。

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

如何使用检查器测试此应用实例? (没有 CoArbitrary 实例(验证 e0 [Char])) 的相关文章

  • cabal install wx 缺少 C 库

    Env 操作系统 feodra 16 Haskell 平台 wxGTK 开发 GHHC 7 0 4 我正在尝试安装 wxHaskell 阴谋集团安装wx 然后给出这些错误 缺少对外国库的依赖 缺少 C 库 wx baseu 2 8 wx b
  • Data.Array 有多快?

    The 文档 http haskell org ghc docs latest html libraries array 0 3 0 3 Data Array html of Data Array reads Haskell 提供了可索引数
  • 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
  • 如何只修改记录的一个字段而不完全重写它? [复制]

    这个问题在这里已经有答案了 It s the second time I m tackling this problem And for the second time this is while working with the Stat
  • Haskell 中多核编程的现状如何?

    Haskell 中多核编程的现状如何 现在有哪些项目 工具和库可用 有哪些经验报道 2009年至2012年期间 发生了以下事件 2012 从 2012 年开始 并行 Haskell 状态更新开始出现在并行 Haskell 摘要 http w
  • 这是 unsafeCoerce 的安全使用吗?

    我遇到的情况是 我目前正在使用极其可怕的函数 unsafeCoerce 幸运的是 这并不是为了任何重要的事情 但我想知道这是否是该函数的安全使用 或者是否有其他方法可以解决其他人知道的这个特定问题 我的代码类似于以下内容 data Toke
  • 检索 Haskell 项目中所有导入的列表

    因此 我的最终目标是通过确保项目导入的所有实体都存在于其声称可以使用的版本中 来评估 cabal 文件中依赖项的准确性 一个好的开始是找到单个源文件使用的所有导入实体的列表 可选地包含有关它们来自何处的信息 我愿意暂时忽略类实例的情况 因为
  • 这个实例有什么问题:ArrowApply Automaton?

    我希望 Automaton 有实例 ArrowApply 但 Control Arrow Transformer Automaton 没有 我认为下面的代码会表现良好 data Automaton b c Auto runAuto b gt
  • Haskell Cabal:“包间接依赖于同一包的多个版本”

    清除我的所有后cabal installed 包 我运行了以下会话 cabal update Downloading the latest package list from hackage haskell org james bast c
  • Haskell 中的内部爆炸模式是否总是强制使用外部构造函数?

    在 Haskell 中 是否存在对于数据类型 LANGUAGE BangPatterns import Control DeepSeq data D D Int 实例 instance NFData D where rnf D 与具有另一个
  • 为什么 GHC 在这里推断出单态类型,即使禁用了单态限制?

    这是由解析 f f pure 的类型 https stackoverflow com questions 55388119 resolving the type of f f pure 55388309 noredirect 1 comme
  • Haskell/Idris 中的开放类型级别证明

    在 Idris Haskell 中 可以通过注释类型并使用 GADT 构造函数 例如使用 Vect 来证明数据的属性 但这需要将属性硬编码到类型中 例如 Vect 必须是与 List 不同的类型 是否有可能拥有具有开放属性集的类型 例如同时
  • 函数式语言与语言实现的角度有何不同

    出现了全新的 函数式编程 范式 与过程式编程相比 它需要彻底改变思维模式 它使用高阶函数 纯度 单子等 我们通常在命令式和面向对象语言中不会看到这些 我的问题是如何执行这些语言与命令式或面向对象语言的不同之处在于 例如内存管理或指针等内部结
  • seq在haskell中代表什么

    我是 Haskell 的新手 刚刚进入惰性世界编程 我读到seq函数非常特殊 因为它强制使用严格的评估 以便在某些情况下更加有效 但我就是找不到什么seq代表字面意思 也许严格评估Q 它应该提醒您 顺序 或 顺序 因为它允许程序员指定其参数
  • 过滤路径列表以仅包含文件

    如果我有一个清单FilePaths 如何过滤它们以仅返回常规文件 即不是符号链接或目录 例如 使用getDirectoryContents main do contents lt getDirectoryContents foo bar l
  • 告诉阴谋集团主模块在哪里

    我有一个具有以下结构的项目 foo cabal src Foo Main hs foo cabal 的一部分如下所示 executable foo main is Foo Main hs hs source dirs src Main hs
  • 带有参考的 Haskell 数据类型

    我正在实现 Ukkonen 的算法 该算法要求树的所有叶子都包含对同一整数的引用 并且我在 Haskell 中执行此操作是为了了解有关该语言的更多信息 但是 我很难编写出执行此操作的数据类型 Node has children indexe
  • 对 F# 中任意嵌套级别的列表求和

    我正在尝试创建一个 F 函数 它将返回列表的总和int任意嵌套 IE 它将适用于list
  • 在没有互联网连接的情况下使用 cabal 安装 Haskell 软件包

    我有一台根本无法访问互联网的机器 我使用通过随身碟从另一台机器获得的安装程序在其上安装了 Haskell 平台 现在我想安装这个包repa在我的家用机器上 无法访问互联网 我该怎么做呢 我的家用计算机运行的是 Linux Debian 我的
  • Haskell 中的参数数量和无点 [重复]

    这个问题在这里已经有答案了 对于多重模式匹配 不同数量的参数是不可能的 即使是无点的 foo True b b 2 foo id 例如 不起作用 但 foo True 2 foo id 做 有时我们只能在函数的一部分使用 point fre

随机推荐

  • 对 require 的调用期望正好有 1 个字符串文字参数

    我想根据传递下来的道具来渲染图像 第一个注释掉的 filePath 是源文件 我尝试了几种变体 但它总是给我同样的错误 React 文档并没有真正涵盖在 30 多种不同场景的情况下你会做什么 我可以向该组件添加一个状态并让它包含所有文件变体
  • VideoJS:不适用于 IOS

    我使用了 videojs 它在所有浏览器 包括 IE 和 Android 上运行良好 但它不适用于 IOS 设备 iphone 和 ipad IOS 版本 6 这是我用来将视频添加到页面的代码
  • 实体框架是否支持并行异步查询? [复制]

    这个问题在这里已经有答案了 当我们启动多个异步实体框架查询时会发生什么并行运行它们 它们在物理上是并行执行的吗 它们是由实体框架序列化的吗 这是不支持的吗 它会导致异常吗 public async Task QueryDatabase us
  • 给定尺寸的值范围的组合

    我使用以下代码创建数组的索引列表 但是 我希望索引按 Fortran 顺序运行 即内部循环是更快的变化循环 有没有办法在 python 中实现这一点 目前 我得到的输出是 C 顺序的 np transpose np nonzero np o
  • 延迟 JQuery 效果

    我想在延迟几秒钟后淡出一个元素及其所有子元素 但我还没有找到一种方法来指定效果应在指定的时间延迟后开始 setTimeout function foo fadeOut 5000 5000 是五秒 以毫秒为单位
  • 使用 PHP 将数据从 MySQL 下载到 csv 文件

    如何指定从数据库下载的文件 main php include databaseConnection php result mysql query SELECT FROM participants while row mysql fetch
  • 使用 Angular 登录 Twitter

    我正在尝试使用 angular2 实现 singin 功能 也请阅读官方文档从这里 但是没明白流程是怎么回事 我的问题是 访问第一步 即 outh token 的参数是什么 有没有任何教授流程的工作示例或最佳文章 我已经阅读了很多关于 SO
  • 将 JWT SecurityToken 传递给 WCF 客户端

    我需要根据用户名 密码身份验证生成并向客户端颁发令牌 我尝试了多种方法来解决这个问题 但所有方法都遇到了问题 我的第一个计划是在我的 WCF 端点上实施 WS Trust Issue 我找到的示例使用了以下方法 OperationContr
  • 有没有办法覆盖`{}`对象?

    我试图使我的程序中的所有哈希都是 ActiveSupport OrderedHash 我可以通过以下方式重写 Hash new 构造函数 Hash ActiveSupport OrderedHash but class仍然是哈希 def 给
  • 为什么不使用 ASP.NET 中的 GDI+

    有人告诉我 从 ASP NET 使用 GDI 是危险且未定义的 这是因为没有设备上下文的保证吗 有人可以解释一下吗 有哪些替代方案 这是MSDN来源 http msdn microsoft com en us library system
  • 当虚拟不起作用时

    目前我的 C 类中有一个奇怪的错误 我有一个 ActiveX 包装类 作为 wxWidgets 的一部分 我向其中添加了一个新的虚拟函数 我有另一个类继承自 ActiveX 类 wxIEHtmlWin 但是 ActiveX 类总是调用它自己
  • 显示无效的 SQL 类型:sqlKind = UNINITIALIZED 错误

    String s1 PasswordText4 getText String s2 ConfirmText4 getText String s3 NameText4 getText String s4 UsernameText4 getTe
  • boost::thread 数据结构大小太荒谬了?

    编译器 linux 上的 clang x86 64 我已经有一段时间没有编写任何复杂的低级系统代码了 而且我通常针对系统原语 Windows 和 pthreads posix 进行编程 所以 进出的事情已经从我的记忆中消失了 我正在与boo
  • VS Code typescript:自动实现接口

    我有一个打字稿界面 想自动实现它 我一直在环顾四周并根据这个计算器问题 and github问题 这个功能应该已经存在 但它对我不起作用 没有出现灯泡 如果接口没有必需的成员 则代码操作 快速修复将不会出现在类定义中 interface I
  • 为什么 scanf 中不需要地址运算符?

    为什么 std gt names firstName 不需要地址运算符 但是 stud gt studentid 中需要地址运算符吗 struct student struct char lastName 10 char firstName
  • adb logcat:增加最大消息长度

    似乎 logcat 截断了很长的日志消息 有没有办法防止这种情况 adb logcat g ring buffer is 64Kb 63Kb consumed max entry is 20480b max payload is 20460
  • 在unix中按文件大小排序

    我有一个 unix 文件 其中包含以下数据 35 ag 0 ca 22 0 K nt 43 8 G ct 90 0 M se 2 4 M ew 1 6 K et 0 er 0 dr 18 ld Output 43 8 G ct 90 0 M
  • 安装错误:INSTALL_FAILED_OLDER_SDK

    我是 Android 开发新手 我想首先获得Hello World应用程序正在运行 我正在使用 Eclipse IDE 和 Android 4 0 3 版本 15 SDK 我从教程网站复制了所有内容 但是当我尝试在virtual devic
  • CMake链接外部库

    首先 我是 CMake 的新手 我刚刚开始使用它 我想将外部库链接到我的项目 我使用我从中获取的代码CMake 维基 在文章末尾 这是我的 CMakeLists txt cmake minimum required VERSION 2 8
  • 如何使用检查器测试此应用实例? (没有 CoArbitrary 实例(验证 e0 [Char]))

    Checkers是一个可重用 QuickCheck 属性的库 特别是 标准类型类 如何编写一个检查器实例来测试我的验证应用实例是否有效 import Test QuickCheck import Test QuickCheck Checke