“约束不小于实例头”是什么意思以及如何解决

2024-07-04

我想写一些类似的东西:

{-# LANGUAGE FlexibleContexts,FlexibleInstances #-}

import Data.ByteString.Char8 (ByteString,pack)
import Data.Foldable (Foldable)

class (Show a) => Rows a where
    rRepr :: a -> [ByteString]
    rRepr = (:[]) . pack . show

instance (Foldable f,Show (f a)) => Rows (f a) where
    rRepr = const []

意思是f a实例化Rows if f实例化Foldable and f a实例化Show。当我运行 ghc 时,我得到:

Constraint is no smaller than the instance head
  in the constraint: Show (f a)
(Use -XUndecidableInstances to permit this)
In the instance declaration for `Rows (f a)'

我有两个问题:

  • 错误中的“较小”意味着什么以及问题是什么?
  • 不使用来定义我想要的内容的正确方法是什么UndecidableInstances?

让我们玩一下编译器:我们有一个类型(f a)我们想看看它是否是一个有效的满足Rows约束。为此,我们需要发送一份证明(f a)满足Show (f a)以及。这不是问题,除非有人写了

 instance Rows (f a) => Show (f a) where ...

在这种情况下,我又回到了开始的地方。像这样编码一个无限循环有点愚蠢,但 Haskell 静态地确保它实际上是不可能的,除非你要求UndecidableInstances.


通常,Haskell 确保“解析追踪”的每一步都会将类型的大小减少至少 1 个构造函数。这通过结构归纳得出了一个非常简单的证明,即我们最终会在有限数量的分辨率中得到裸类型。

这是过度限制性的,显然一些实例解析步骤是有意义的、有用的和总体的,即使它们不会立即减少构造函数树。同样的总体性限制也适用于 Agda 和 Coq 等语言,并且将算法操纵为通过结构归纳进行的算法通常是一个说明性的挑战。


那么我们该如何解决呢?一种方法是失去Show的约束class定义使用像这样的实例Show1 from 前奏曲 http://hackage.haskell.org/packages/archive/prelude-extras/0.3/doc/html/Prelude-Extras.html.

class Show1 f where ...
show1 :: (Show1 f, Show a) => f a -> String  -- not an instance definition!

然后有instance (Foldable f, Show1 f, Show a) => Rows (f a) where ...这在我的测试中有效。然后,您可以将默认实例编写为独立函数。

defRRepr :: Show a => a -> [ByteString]
defRRepr = (:[]) . pack . show

并在为 a 编写实例定义时使用它Show能干的事。


另一种解决方案是使用newtype包装器允许 Haskell 看到解析的“层”已被删除。

instance (Foldable f, Show (f a)) => Rows (FoldableRow f a) where
    rRepr = const [] . unFR

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

“约束不小于实例头”是什么意思以及如何解决 的相关文章

  • 系统地将函数应用于 haskell 记录的所有字段

    我有一条包含不同类型字段的记录 以及一个适用于所有这些类型的函数 举一个小 愚蠢 的例子 data Rec Rec flnum Float intnum Int deriving Show 比如说 我想定义一个为每个字段添加两条记录的函数
  • 计算出类型索引的自由 monad 的细节

    我一直在使用免费的 monad 来构建 DSL 作为语言的一部分 有一个input命令 目标是在类型级别反映输入原语期望的类型 以提高安全性 例如 我希望能够编写以下程序 concat Action String String concat
  • 加快 GHC 中的编译速度

    除了 O0 这可以加快编译时间吗 如果生成的程序未被优化也没关系 实际上我只想经常快速地对大型 haskell 包进行类型检查 Flag fno code极大地加快了编译速度 但无法使用它 因为该程序使用了 TemplateHaskell
  • 记录语法和求和类型

    我有关于 Haskell 中的总和类型的问题 我想创建一个由两个或多个其他类型组成的总和类型 并且每个类型可能包含多个字段 一个简单的例子是这样的 data T3 T1 a Int b Float T2 x Char deriving Sh
  • 为什么在 haskell 中不带括号不可能进行负数相乘

    乘法5 3在 haskell gchi 中给了我一个错误 但乘以5 3 工作正常 为什么需要括号 ghci GHCi version 7 4 1 http www haskell org ghc for help Loading packa
  • 自动函子实例

    给定以下代数类型 ghci gt data Foo a Foo a 然后我实例化其中之一 ghci gt let f Foo foo 最后 我想打电话给fmap将函数应用为 a gt b gt Foo a gt Foo b ghci gt
  • ghci 中严格求和/严格折叠导致内存爆炸

    正如中提到的为什么 sum takeWhile 以下是not炸毁记忆ghci https stackoverflow com questions 14298930 why does sum takewhile 10000000 1 use
  • 使用 Haskell 识别段落中的单词数

    我是 Haskell 和函数式编程的新手 我有一个 txt包含一些段落的文件 我想使用 Haskell 计算每个段落中的单词数 我已经写了输入 输出代码 paragraph words String gt int no of words I
  • Haskell 类型族中的类型歧义

    我正在尝试整理以下课程Domain及其实例TrivialDomain LANGUAGE TypeFamilies data Transition Transition class Domain d where type Set d type
  • 不明确的类型和重载数字运算的默认值

    import Data Dynamic default Integer Double a Num a gt a a 5 show Show a gt a gt String toDyn Typeable a gt a gt Dynamic
  • 如何构图“也许”镜头?

    如果我有嵌套记录的镜头 其中每个镜头返回一个Maybe 我怎样才能让它们组合起来 这样如果 遍历 中有任何东西返回一个Nothing最终结果是Nothing data Client Client clientProperties Maybe
  • 列出树中叶子的路径

    我正在尝试编写一个函数来查找树中叶子的所有路径 例如 给定一棵如下所示的树 1 2 5 3 4 6 输出列表将是 1 2 3 1 2 4 1 5 6 该函数的类型签名是 branches Tree a gt a 请注意 这使用了中定义的 T
  • 如何定义类别实例的相等性?

    为了证明例如类别法则对于某种数据类型的某些操作 如何决定如何定义相等性 考虑使用以下类型来表示布尔表达式 data Exp ETrue EFalse EAnd Exp Exp deriving Eq 试图证明这一点是否可行Exp形成一个具有
  • “引用透明”IO 调用的可重入缓存

    假设我们有一个 IO 操作 例如 lookupStuff InputType gt IO OutputType 这可能是一些简单的事情 例如 DNS 查找 或者针对时不变数据的某些 Web 服务调用 我们假设 该操作永远不会抛出任何异常和
  • 在 Haskell 和 C 之间交换结构化数据

    首先 我是 Haskell 初学者 我计划将 Haskell 集成到 C 中以实现实时游戏 Haskell 负责逻辑 C 负责渲染 为此 我必须在每个周期 每秒至少 30 次 相互之间传递大量复杂的结构化数据 游戏状态 所以传递的数据应该是
  • 为什么使用 UndecidableInstances 编译此代码,然后生成运行时无限循环?

    当使用编写一些代码时UndecidableInstances早些时候 我遇到了一些我觉得很奇怪的事情 我无意中创建了一些代码 当我认为不应该进行类型检查时 LANGUAGE FlexibleInstances LANGUAGE MultiP
  • 我在哪里可以学习高级 Haskell? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 在评论中我的答案之一 https stackoverflow com questions 4633584 algorithm to gen
  • Haskell Stack 构建特定的可执行文件

    如何构建特定的堆栈可执行文件 即 那些指定的projectname cabal like executable executable name hs source dirs tools main is ExecutableModule hs
  • “约束不小于实例头”是什么意思以及如何解决

    我想写一些类似的东西 LANGUAGE FlexibleContexts FlexibleInstances import Data ByteString Char8 ByteString pack import Data Foldable
  • Haskell:如何评估“1+2”等字符串

    实际上我有一些公式 x y 这是一个String 我设法更换了x y具有特定值的变量 例如 1 2 这仍然是String类型 现在我的表情就像 1 2 所以问题是如何计算字符串类型的表达式并得到结果 PS 我想要某样东西read 可以直接转

随机推荐

  • Facebook 网址中的“?fref=jewel”是什么意思?

    我在 Facebook 上收到了几个来自个人资料的好友请求 其链接以 fref jewel 结尾 所有链接的网址中都有这个结尾词 有些个人资料可能是假的 谁能告诉我 fref jewel 是什么意思 它只是意味着用户单击通知 jewel F
  • 从aws s3 pyspark读取文件数据

    我在 s3 中放置了一个 json 文件 s3 url 类似于以下网址 https s3 eu region 1 amazonaws com dir resources sample json 但在 pyspark 中 当传递相同时 它不会
  • 从其选项卡访问常规 UITabBarController 属性?

    我将描述我想做的事情 我有登录页面 ViewController 登录后 我传递到 UITabBarController MainTabBar m 这个MainTabBar有 key 属性 它从登录页面获取用户密钥 UITabBarCont
  • 如何在运行时修改strings.xml文件

    我将仅动态获取本地化数据 有办法更新吗strings xmlAndroid 运行时文件 我们可以在运行时向文件添加新字符串吗 我们可以在运行时向文件添加新字符串吗 不 您可以创建翻译数据库并维护该数据库 将新翻译动态添加到数据库并从那里读取
  • 开发者拒绝后在新的 iTunes Connect 中提交新的应用程序版本

    我从新 iTunes Connect 的提交队列中删除了我的构建 现在 当我向应用程序商店提交新版本时 它们会显示在 预发布 下 但不会显示在 版本 下 所以现在我的应用程序信息中只显示 1 0 准备出售 1 0 25 开发人员已拒绝 在
  • 在java中将图像转换为二进制数据(0和1)

    我想从 url 读取图像并将其转换为二进制数据 请帮我 byte data null ByteArrayOutputStream bas null try URL u new URL http www eso org public arch
  • /*@cc_on和IE6检测

    在研究 IE 的 JavaScript 条件注释时 我偶然发现了 cc on 这似乎有效 但是 那维基百科条目 http en wikipedia org wiki Conditional comment条件注释提供了以下代码 用于更强大的
  • 如何将 BufferedImage 转换为黑白图像?

    如何将现有的彩色 BufferedImage 转换为单色 我希望图像完全分为两个 RGB 代码 黑色和白色 因此 如果图像周围有一个边框 该边框是背景的较浅或较暗的阴影 并且背景正在转换为白色 那么我希望边框也转换为白色 依此类推 我怎样才
  • 使用 ActionFilter 进行 ASP.NET Core 日志记录

    我正在尝试添加日志记录功能以保存到我的 SQL Server 数据库 我尝试创建 ActionFilter 类并应用于我的控制器之一 但不起作用 我想捕获用户 ID IP 地址 控制器和操作访问以及时间戳 我缺少什么 AuditAttrib
  • 寄存器和共享内存取决于编译计算能力?

    当我编译时nvcc arch sm 13 I get ptxas info Used 29 registers 28 16 bytes smem 7200 bytes cmem 0 8 bytes cmem 1 当我使用nvcc arch
  • 粘性页眉和页脚可滚动内容

    我正在尝试创建一个包含三个 div 的页面 页眉 页脚和内容区域 这些应该占据 100 的屏幕 页眉和页脚很小并且不会改变 内容区域可以是任意大小 所以我添加了overflow auto当它变得太大时使其滚动 问题是 它溢出了屏幕的高度 我
  • 如何在android中使用Volley库上传文件?

    我已经有一个子类Request
  • 如何通过 AngularJS 使用 SOAP WebService?

    好吧 我有一个 SOAP WebService 通常供 PHP 客户端使用 工作完美 通过 ajax 消费这个 php 并填充我的模板 我当前的应用程序执行以下过程Angular lt gt PHP lt gt service wsdl 我
  • Lion 更新删除了“postgres”用户。如何恢复呢?

    几个月前我用 kyngchaos 安装程序安装了 postgres 我现在已更新到 OSX Lion 但数据库服务器无法启动 kyngchaos 博客上的评论 http www kyngchaos com blog 2011 2011072
  • Angular 单元测试模拟重播主题

    我有一个带有重播主题的服务 export class UserService public userChanged ReplaySubject
  • 异步 Google 广告与同步广告

    我正在使用谷歌 DFP 广告管理系统 如果我使用来自谷歌的同步广告 我的网站加载速度会很慢 因为它需要在加载网站的同时加载广告 如果广告需要很长时间才能响应 那么页面的加载就会暂停 如果我使用异步广告 这不是问题 因为无论广告是否加载 页面
  • 当不从终端运行应用程序时,东西“打印”到哪里?

    所以我有一个 python 应用程序 正在使用 py2app 将其捆绑到 app 中 我在那里有一些调试打印语句 如果我在终端中运行代码 这些语句通常会打印到标准输出 如果我只是打开捆绑的 app 显然我看不到任何输出 即使我没有看到 这些
  • 似乎无法设置表单的编码类型。 (Javascript)

    我正在尝试硬连线一个即时创建的表单 以使用编码类型 发送 JSON application json 在 jQuery 中 我会将其设置为 contentType in an ajax or a post 但是由于某些原因 我需要手动执行此
  • 在 golang func 中使用默认值[重复]

    这个问题在这里已经有答案了 我正在尝试根据帖子的选项 1 实现默认值Golang 和默认值 https joneisen me programming 2013 06 23 golang and default values html 但是
  • “约束不小于实例头”是什么意思以及如何解决

    我想写一些类似的东西 LANGUAGE FlexibleContexts FlexibleInstances import Data ByteString Char8 ByteString pack import Data Foldable