类中的部分评估类型

2024-03-01

这是我提出的问题的具体版本here https://stackoverflow.com/questions/60072003/reordering-type-parameters-in-haskell。我有一个算法,可以产生一些输出,并且可以产生一些辅助信息,在给定情况下我可能会或可能不关心这些信息(下面我将此辅助信息称为“注释”)。我用欧几里得算法来举例说明:

class AnnotatedGcd m where
    actually :: (Integral a) => a -> m a
    update :: (Integral a) => a -> m a -> m a

newtype GcdOnly a = Gcd a deriving Show

instance AnnotatedGcd GcdOnly where
    actually = Gcd
    update q = id

newtype GcdWithSteps a = GcdS (a, Int) deriving Show

instance AnnotatedGcd GcdWithSteps where
    actually x = GcdS (x, 0)
    update q (GcdS (x, s)) = GcdS (x, s+1)

newtype GcdExtended a = GcdE (a, a, a) deriving Show

instance AnnotatedGcd GcdExtended where
    actually x = GcdE (x, 1, 0)
    update q (GcdE (x, k, l)) = (GcdE (x, l, k - q*l))

gcd :: (Integral a, AnnotatedGcd m) => a -> a -> m a
gcd a b = if b == 0 then actually a else update q ((Main.gcd) b r)
  where q = a `div` b
        r = a `rem` b

功能gcd a b返回一个AnnotatedGcd在这个例子中可以是GcdOnly这只是 gcd g,或者也可能是GcdWithSteps另外计算它走了多少步,或者可以是GcdExtended还提供系数 k,l 使得 g = k * a + l * b:

*Main> (Main.gcd 253 83) :: (GcdOnly Int)
Gcd 1
*Main> (Main.gcd 253 83) :: (GcdWithSteps Int)
GcdS (1,4)
*Main> (Main.gcd 253 83) :: (GcdExtended Int)
GcdE (1,21,-64)

现在如果我想计算步数怎么办and得到系数?而不是继续写越来越多的实例AnnotatedGcd我想要有注释的概念,并说注释的元组再次是注释:

class GcdAnnotation a where
    emptyAnnotation :: a
    annotate :: Integral b => b -> a -> a

instance (GcdAnnotation a, GcdAnnotation b) => GcdAnnotation (a,b) where
    emptyAnnotation = (emptyAnnotation, emptyAnnotation)
    annotate q (x, y) = (annotate q x, annotate q y)

instance (GcdAnnotation a, GcdAnnotation b, GcdAnnotation c) => GcdAnnotation (a,b,c) where
    emptyAnnotation = (emptyAnnotation, emptyAnnotation, emptyAnnotation)
    annotate q (x, y, z) = (annotate q x, annotate q y, annotate q z)

instance GcdAnnotation b => AnnotatedGcd (,b) where
    actually x = (x, emptyAnnotation)
    update q (g, x) = (g, annotate q x)

除了最后一个实例声明之外,这是有效的 Haskell 代码。问题是:如何才能真正做出这样的声明?

一般版本是:给定两个参数类Class a and Class b如何转换元组(a,b)到两个类的实例中(一个与第一个参数相关,一个与第二个参数相关)。


None

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

类中的部分评估类型 的相关文章

  • 为什么类型级计算需要 Aux 技术?

    我很确定我在这里遗漏了一些东西 因为我对 Shapeless 还很陌生并且我正在学习 但是 Aux 技术实际上是什么时候required 我看到它是用来暴露type通过将其提升为另一个 同伴 的签名来声明type定义 trait F A t
  • Haskell 单例:我们可以通过 SNat 获得什么

    我正在尝试使用 Haskell 单例 在论文中使用单例进行依赖类型编程 http cs brynmawr edu rae papers 2012 singletons paper pdf并在他的博客文章中单例 v0 9 发布 https t
  • 为什么 GeneralizedNewtypeDeriving 没有安全的 Haskell?

    来自 GHC 手册 第安全语言 http www haskell org ghc docs 7 6 2 html users guide safe haskell html safe language 模块边界控制 使用安全语言编译的 Ha
  • 如何在 TS 中使用泛型谓词

    我想使用数组过滤谓词函数 e g const isNotEmptyName
  • 如何将可选标志解析为 Maybe 值?

    我正在尝试使用optparse 应用程序 https hackage haskell org package optparse applicative 0 11 0 2解析一个Maybe String但我找不到任何地方如何处理Maybe 我
  • 算法 - 如何有效删除列表中的重复元素?

    有一个list L 它包含以下元素任意类型each 如何有效删除此类列表中的所有重复元素 必须保留订单 只需要一个算法 因此不允许导入任何外部库 相关问题 在Python中 从列表中删除重复项以使所有元素都是唯一的最快算法是什么在维持秩序的
  • 表达式“ap zip tail”如何工作

    我想知道怎么写f x zip x tail x 点免费 所以我使用了pointfree程序 结果是f ap zip tail ap作为 Control Monad 的函数 我不明白点自由定义是如何工作的 如果我能从类型的角度去理解的话 希望
  • 如何向 Scotty 中间件添加基本身份验证?

    我目前正在制作 Scotty API 但找不到任何 basicAuth 实现的示例 Wai Middleware HttpAuth 具体来说 我想将基本身份验证标头 用户 通行证 添加到我的某些端点 即以 admin 开头的端点 我已经设置
  • Haskell 二进制解析

    我一直在尝试在 haskell 中实现一个协议解析器 而且我对这门语言还很陌生 特别是当涉及到 monad 时 我一直在使用binary 0 5 0 2 并描述了协议的标头和所有有效负载 我想要解析的消息如下所示 header payloa
  • Java长到MySQL

    Java相当于什么long在 MySQL 的上下文中数据类型 SIGNED BIGINT http dev mysql com doc refman 5 0 en numeric types html是一个 8 字节长的整数 就像 Java
  • “反向”使用 Maybe Monad

    假设我有很多功能 f a gt Maybe a g a gt Maybe a h a gt Maybe a 我想按以下方式组合它们 如果 f 返回 Nothing 则计算 g 如果 g 返回 Nothing 则计算 h 如果其中任何一个计算
  • 如何找到仅是 2、3 和 5 的幂的倍数的所有数字的列表? [复制]

    这个问题在这里已经有答案了 I am trying to generate a list of all multiples which can be represented by the form where a b and c are w
  • 为什么使用非十进制数据类型不划算?

    tl dr 我的怎么了Cur 货币 结构 tl dr 2 在给出示例之前 请先阅读问题的其余部分float or double 我知道这个问题在互联网上已经出现过很多次了 但是我还没有看到令人信服的答案 所以我想我会再问一次 我无法理解为什
  • GHC 是否使用存在类型的动态调度?

    下面的代码是否使用了 C 或 Java 中所理解的动态调度 据我了解 在最后一行 编译器不可能在编译时知道要调用哪个 实现 但代码会编译并产生正确的结果 有人可以解释一下 这背后有什么样的实现 例如 vptr 吗 LANGUAGE Exis
  • 在 haskell 中处理 IO 与纯代码

    我正在编写一个shell脚本 我在haskell中的第一个非示例 它应该列出一个目录 获取每个文件大小 进行一些字符串操作 纯代码 然后重命名一些文件 我不确定我做错了什么 所以有两个问题 我应该如何安排这样的程序中的代码 我有一个具体问题
  • 对元组列表进行排序的函数 - Haskell

    抱歉 这个简单的问题只是我对 haskell 非常陌生 我正在尝试编写一个函数 order 它将对另一个函数 Frequency 生成的元组列表进行排序 频率计算列表中不同元素的数量 a给出一个这样的结果 比如 gt 频率 aabbbccc
  • 管道中缺少 ResourceT 实例

    我在尝试使用时遇到奇怪的错误ResourceT http hackage haskell org package conduit 1 0 9 1 docs Data Conduit html t 3aResourceT来自管道 1 0 9
  • 如何处理在组合下发生变化的类型?

    我最近读了一篇非常有趣的论文单调性类型 https infoscience epfl ch record 231867 files monotonicity types pdf其中描述了一种新的 HM 语言 该语言可以跟踪操作之间的单调性
  • 在Python中检测re(regexp)对象

    我想知道什么是正确的 pythonic 向后和向前兼容的方法如何检查对象是否已编译re object isinstance方法不能轻易使用 而生成的对象声称是 sre SRE Pattern object gt gt gt import r
  • 为什么 Haskell 中的点是从右向左排列的?

    如果我们有两个函数 f and g 然后在哈斯克尔h f g相当于h x f g x IE 这些函数从右到左应用于输入 有什么根本原因可以解释为什么它是从右到左 而不是从左到右吗 IE 他们为什么不做h f g相当于h x g f x 反而

随机推荐

  • Spring JdbcTemplate:如何限制选定的行?

    我正在使用春天JdbcTemplate用于从 MS SqlServer DB 获取数据的接口 在文档中我看到有setMaxRows 方法来设置所有查询的限制 但是如果我只想限制一个选择怎么办 有没有办法以 可配置 的方式仅对特定调用的查询设
  • 计算 facebook 封面偏移 y

    我正在使用 Facebook SDK 获取用户封面照片 我有 img 的路径和偏移量 y source http a5 sphotos ak fbcdn net hphotos ak ash3 526114 459046674110601
  • 以编程方式将用户权限添加到 Sharepoint 中的列表

    如何以编程方式将用户权限添加到 Sharepoint 中的列表 我想为某个列表的用户或组添加 贡献 权限 我正在使用 C 您可以使用SP角色分配 http msdn microsoft com en us library microsoft
  • 将枚举值传递给角度 2 组件

    我有一个enum 并且想要从模板传递enum价值 这怎么可能 export enum FIELDS GENDER
  • 多个 y 尺度,但仅启用一个用于平移和缩放

    考虑以下用于绘制 matplotlib 图形的 python 代码 import matplotlib pylab as pp import numpy as np alpha np linspace 0 2 np pi 400 sig1
  • 使用 HTMLUnit 使用 Java 以编程方式登录 Facebook

    这个问题有点像这个问题的补充 如何使用 Java 以编程方式登录 Facebook https stackoverflow com questions 2285250 how to log into facebook programmati
  • 是否可以让 Handler 意识到它已被删除?

    我正在编写一个自定义日志配置类 它设置一个特定的处理程序并将其与根记录器关联 并计划在多个应用程序中使用它 我担心实际的程序代码会删除该处理程序并安装另一个处理程序 有没有一种方法可以让处理程序检测到它已从特定记录器中删除 或者让记录器报告
  • 显示喜欢项目列表中的项目的用户

    我认为这是一个不切实际的问题 但我想得到一些反馈来确认 我有一个产品和用户数据库 用户可以在其中喜欢产品 喜欢的数据存储在仅包含 pid 和 uid 的参考表中 客户请求是显示喜欢产品列表中每个产品的 3 位用户 问题是 不可能在产品列表的
  • Chrome/Webkit 中的 CSS 动画/缩放问题

    此效果在 FF 中运行良好 但在 Chrome 中则不然 Chrome 中的 Firebug 结果显示 webkit animation 未在 Chrome 中呈现 然而 在 Firefox 中 您会在对象入口处看到 拉伸 效果 在 Chr
  • 使用 ICS 更改 wifi 网络时,ErrnoException:isConnected 失败:EHOSTUNREACH(没有到主机的路由)

    在 ics 上使用我的应用程序时 将 wifi 网络从网络更改为网络后 所有图像请求都开始返回 但出现异常 异常失败 gt org apache http conn HttpHostConnectException Connection t
  • 使用 Scanner 的 nextLine() 和 hasNextLine() 方法时出现问题

    我有一个包含以下数据的日志文件 最短路径 2 RV3280 RV0973C RV2888C最短路径 1 RV3280 RV2502C最短路径 2 RV3280 RV2501C RV1263最短路径 2 RV2363 Rv3285 RV328
  • Windows 服务如何以标准时间间隔启动应用程序?

    顾问设置 Windows 服务来运行应用程序 该应用程序应该每 15 分钟运行一次 该应用程序根本没有运行 并且服务似乎运行良好 我不熟悉应用程序作为服务运行时如何以标准间隔运行 该服务使用 SRVANY EXE 工具 任何使用 SRVAN
  • mysql删除重复数据

    这向我显示了所有具有完全相同的两个条目的名字和姓氏 SELECT firstname lastname COUNT AS Count FROM people GROUP BY firstname lastname HAVING Count
  • 尝试运行 Strapi 会出现模块解析错误

    我正在尝试通过 Ubuntu 20 04 上的 npm 使用 npm rundevelop 运行一个 Strapi 项目 该代码来自我的一个小组项目 没有其他人遇到这些问题 Error cache plugins strapi plugin
  • 带有 goto 命令的 Windows 批处理文件不起作用

    我对 GOTO 命令和附属标签有疑问 事实 给定文件夹中的一堆文件 它们是日志错误 我需要打开它们并检查它们是否包含特定字符串 如果是 则从文件名中删除一些字符 最后一次出现 之后的所有字符 包括其本身 并执行其他操作 为了切断字符 我以循
  • F# 缺少类型约束

    在以下代码中 请注意 get Zero 的类型约束 type Wrapper lt t gt Data t let compute lt t when t static member get Zero unit gt t and t sta
  • nodejs Route.get() 需要回调函数但得到一个 [object String]

    我开始使用带有express的nodejs进行编码 所以我在我的文件 test js 中执行了此操作 该文件位于我的文件夹中 const express require express const router new express Ro
  • 每组查询的前 3 个值 MS Access

    我是 MS Access 的新手 我正在尝试进行一个查询 该查询将根据分数提取 3 个不同类别中的前 3 名人员 即期望的结果是 Child s name Membership Type Total Points Jon Snow Seni
  • 无法在特定 div 上滚动来触发 jquery 函数

    简短版本 这有效 document on click Container function 这不会 document on scroll Container function 长版 很抱歉 发布代码片段是不可行的 因为它是一个复杂的类似应用
  • 类中的部分评估类型

    这是我提出的问题的具体版本here https stackoverflow com questions 60072003 reordering type parameters in haskell 我有一个算法 可以产生一些输出 并且可以产