声明参数化类型同义词的实例

2024-03-20

我有很多适用于向量的函数,即具有类型强制长度的列表。

我试图让我的类型更容易编写,即而不是编写

foo :: (Fold Integer v, Map Integer Integer v v, ...) => ...

我正在宣布一个新班级NList所以我可以写foo :: NList v Integer => ...

(简化的)类如下所示:

class ( Fold (v i) i
      , Map i i (v i) (v i)
      , Map i (Maybe i) (v i) (v (Maybe i))
      ) => NList v i

正如您所看到的,我必须将“向量”类型与“项目”类型分开(即v从.....分离i)这样我就可以做类似的事情Map onto a Maybe vector.

像这样,v必须有种类* -> *, and i kind *.

然而,当我尝试用这样的向量实例化它时:

instance NList Vec2 Integer
instance NList Vec3 Integer
...

我收到以下错误:

Type synonym `Vec2' should have 1 argument, but has been given none
In the instance declaration for `NList Vec2 Integer'

现在,我对类型级编程非常陌生,并且我知道我可能会以非常落后的方式进行此操作。是否可以实例化这样的类型同义词?是否有任何类型向导可以提供更好的方法来实现我的目标的建议?


这里的问题是Vec2 and Vec3大概被声明为这样的:

type Vec2 a = Vec (S (S Z)) a
type Vec3 a = Vec (S (S (S Z))) a

由于各种神秘的原因,类型同义词不能部分应用(它们会导致类型级 lambda,这会严重破坏与实例解析和推理相关的各种事物 - 想象一下,如果您可以定义type Id a = a并使其成为一个实例Monad).

也就是说,你无法使Vec2任何事物的实例,因为你不能使用Vec2就好像它是一个成熟的类型构造函数,具有以下类型* -> *;它实际上是一个只能完全应用的类型级“宏”。

然而,你can将类型同义词定义为部分应用程序本身:

type Vec2 = Vec (S (S Z))
type Vec3 = Vec (S (S (S Z)))

这些是等效的,只是您的实例将被允许。

If your Vec3类型实际上看起来像

type Vec3 a = Cons a (Cons a (Cons a Nil)))

或类似的,那么你就不走运了;你必须使用newtype如果您想提供任何实例,请使用包装器。 (另一方面,您应该能够完全避免直接在这些类型上定义实例,方法是为Nil and Cons相反,允许您使用Vec3作为一个例子。)

请注意,GHC 7.4 的新功能约束种类 http://blog.omega-prime.co.uk/?p=127,您可以完全避免单独的类型,而只需定义一个约束同义词:

type NList v i =
    ( Fold (v i) i
    , Map i i (v i) (v i)
    , Map i (Maybe i) (v i) (v (Maybe i))
    )

就您的总体方法而言,它基本上应该可以正常工作;使用相同的一般思想Vec http://hackage.haskell.org/package/Vec包裹。大量的类和大的上下文可能会使错误消息变得非常混乱并减慢编译速度,但这就是类型级黑客的本质。不过,如果你有一定的基础Vec类型定义为通常的 GADT:

data Vec n a where
    Nil :: Vec Z a
    Succ :: a -> Vec n a -> Vec (S n) a

那么你实际上根本不需要任何类型类。如果它以其他方式定义,但仍然在类型级别自然参数化,那么您可以将所有类替换为一个类:

data Proxy s = Proxy

class Nat n where
    natElim
        :: ((n ~ Z) => r)
        -> (forall m. (n ~ S m, Nat m) => Proxy m -> r)
        -> Proxy n
        -> r

这应该允许您完全消除上下文,但使定义向量上的操作变得有点棘手。

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

声明参数化类型同义词的实例 的相关文章

  • Haskell 下划线与显式变量

    我已经学习 Haskell 几个星期了 我有一个关于下划线的使用的问题 作为函数参数 我认为用一个具体的例子来问我的问题会更好 假设我想定义一个函数 根据提供的索引提取列表的元素 是的 我意识到 已经是预先定义的 我可以定义该函数的两种方法
  • Haskell scala 互操作性

    我是 Scala 初学者 来自面向对象范式 在了解 Scala 的函数式编程部分时 我被引导到 Haskell 纯函数式编程语言 探索 SO 问题答案 我发现 Java Haskell 具有互操作性 我很想知道 Scala Haskell
  • 我应该在 Turtle 或 Foldl 包中使用折叠吗?

    我在使用 Turtle 时遇到了一些困难 直到盯着难以理解的错误消息几分钟后才意识到我使用了错误的fold功能 https hackage haskell org package turtle 1 5 8 docs Turtle Shell
  • Haskell:是的,没有类型类。为什么是整数?

    我有一个关于 GHCi 如何假定整数类型的问题 我正在阅读 Learn you a Haskell 是 否类型的课程 如果您想阅读全文 这里有一个链接 http learnyouahaskell com making our own typ
  • Scala:如何将可变参数指定为类型?

    代替 def foo configuration String String 我希望能够写 type Configuration String String def foo configuration Configuration 主要用例是
  • Haskell 中的分类结构

    Hask通常被认为是一个范畴 其对象是类型 态射是函数 然而 我看到 Conor McBride pigworker 警告不要使用Hask多次 1 https stackoverflow com a 45905082 474311 2 ht
  • 在 Yesod 生态系统中,对某些文本进行 urlencode 的最佳方式是什么?

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

    这个问题的答案是社区努力 help privileges edit community wiki 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 几天来 我一直试图理解 Haskell 中的函数式编程范例 我通过阅读教程和观看截屏视频
  • Traversable 类型类的用途

    有人可以向我解释一下类型类的目的是什么吗Traversable 类型类定义是 class Functor t Foldable t gt Traversable t gt where So Traversable is a Functor
  • 简单 Haskell Monad - 随机数

    我正在尝试扩展代码这个帖子 https stackoverflow com questions 3944170 haskell and state 接受的答案 允许我能够基于以种子作为参数的函数 randomGen 调用 randomGen
  • 在学术 CS 世界中,“非类型化”是否也意味着“动态类型化”?

    我正在阅读一个幻灯片 上面写着 JavaScript 是无类型的 这与我的想法相矛盾 所以我开始挖掘并尝试了解更多信息 每个答案JavaScript 是一种无类型语言吗 https stackoverflow com questions 9
  • 你能识别 Haskell 程序中的无限列表吗? [复制]

    这个问题在这里已经有答案了 可能的重复 如何判断列表是否是无限的 https stackoverflow com questions 7371730 how to tell if a list is infinite 在Haskell中 你
  • Haskell:IORef 的性能

    我一直在尝试在 Haskell 中编码一个需要使用大量可变引用的算法 但与纯粹的惰性代码相比 它 也许并不奇怪 非常慢 考虑一个非常简单的例子 module Main where import Data IORef import Contr
  • 检查一个数字是 int 还是 float

    在perl中 我想检查给定变量是否包含浮点数 为了检查我正在使用的 my Var 0 02 Floating point number if int Var Var floating point number 但上面的代码对于 0 0 不起
  • Data.Sequence 中的 inits 和 tails 如何工作?

    Louis Wasserman 编写了当前的实现inits and tails in Data Sequence 他表示它们非常高效 事实上 只要查看代码 我就可以看到 无论它们在做什么 它们都是以干净 自上而下的方式进行的 这往往会给惰性
  • 为什么 Double 不能隐式转换为 Decimal

    我不明白十进制和双精度的转换规则 这样做是合法的 decimal dec 10 double doub double dec 然而令我困惑的是 decimal 是 16 字节的数据类型 而 double 是 8 字节 因此将 double
  • 带有 RankNTypes 扩展的奇怪类型推断

    我正在尝试在 Haskell 中尝试 System F 类型 并通过以下方式实现了自然数的 Church 编码type 当加载这段代码时 OPTIONS GHC Wall LANGUAGE RankNTypes type CNat fora
  • 如何处理最终字符串?

    制作有什么好处吗String as final或者我们可以做String as final 我的理解是 由于 String 是不可变的 因此没有必要将其设为最终的 这是正确的还是人们想要的情况String as Final Code pri
  • Haskell:不在范围内:数据构造函数

    今天开始在学校学习 haskell 我遇到了函数问题 我不明白为什么它不在范围内 代码如下 ff Char gt Char gt Char ff A B x 0 y 1 x lt A y lt B x 1 y 0 和错误 md31 hs 2
  • 如何在Haskell中实现词法分析器和解析器

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

随机推荐

  • 无法在 Mavericks 下使用我自己的 kestore 和 xcodebuild

    我正在尝试迁移一些 iOS xcode 构建服务器以使用 Mavericks 这对于 xcode 6 构建至关重要 然而 使用过去在 Mountain Lion 中工作的代码调用 xcodebuild 似乎不再工作并导致 Code Sign
  • MySQL统计复杂查询结果?

    我有以下查询 count SELECT COUNT FROM post GROUP BY ID HAVING ID NOT IN SELECT taxiID FROM taxi WHERE userID userID AND value I
  • 在单个请求中渲染多个视图

    我试图在单个请求中返回多个视图 并以 JSON 字符串形式返回它们 Example RequestMapping value my request public void myRequest HttpServletRequest reque
  • 如何为集合提供带有迭代器的 const 接口?

    我想创建一个具有如下签名的函数 Set found to be an iterator to the location of key in map or end if not found bool lookup const Key key
  • 使用 Webbrowser C# 从 iframe 读取 HTML 代码

    如何使用WebBrowser读取IFRAME html代码 我有一个带有 iframe 的网站 点击几次后 新的 URL 会在此 IFRAME 中打开 其中包含 HTML 代码的某些部分 有可能读到这个吗 当我尝试 Navigate 到此
  • 从 GIF 文件的字节数组中提取各个帧的字节数组

    我有一个byte GIF 文件的 我想从中提取所有帧 我可以使用提取帧System Drawing Image and System Drawing Imaging 但这些都需要System Drawing我不能在我的项目中使用它 因为 U
  • 使用 XSLT 转换 Heat 生成的 .wxs(添加RegistryValue 并编辑一些值)

    这是我想要的输出
  • Prolog:覆盖谓词和使用它之间的区别

    我觉得自己真的很愚蠢 感觉自己错过了一些东西 我基本上有两个文件 module pl通用逻辑规则 可重用 state pl一个针对当前场景 在模块文件中 module pl 我已经声明 inside Food Eater T isTime
  • Hadoop MapReduce:可以在一个 hadoop 作业类中定义两个映射器和缩减器吗?

    我有两个独立的 java 类 用于执行两个不同的 MapReduce 作业 我可以独立运行它们 对于这两个作业 它们所操作的输入文件是相同的 所以我的问题是是否可以在一个java类中定义两个映射器和两个缩减器 例如 mapper1 clas
  • 从构造函数初始值设定项抛出异常

    从构造函数初始值设定项抛出异常的最佳方法是什么 例如 class C T0 t0 can be either valid or invalid but does not throw directly T1 t1 heavy object d
  • 为什么查询sqlite数据库时需要创建游标?

    我完全陌生Python sqlite3模块 https docs python org 3 6 library sqlite3 html 以及一般的 SQL 这完全难倒了我 大量缺乏描述cursor objects https docs p
  • 将 JaCoCo 与 SONAR 集成以实现单元和集成测试覆盖

    有没有人尝试使用 ANT 构建配置 JaCoCo 将单元测试和集成测试的覆盖范围转储到 2 个不同的文件中 以便 SONAR 使用它们 这是一个可行的解决方案 为单元测试和集成测试生成报告 该解决方案使用的是append战略 请注意 为了在
  • 具有不同输入的全卷积网络

    我有一个完全卷积神经网络 U Net 可以在下面阅读 https arxiv org pdf 1505 04597 pdf https arxiv org pdf 1505 04597 pdf 我想用它来对图像进行像素分类 我的训练图像有两
  • 无法导入 Materialise CSS JS 反应

    大家 早安 我一直在努力让具体化CSS在我的react app上工作 特别是Javascript文件 我尝试了多种方法 但这是我认为我已经走得更远的一种 在我的 landingpage js 文件中 import React Compone
  • 仅隐藏供应商提供的类的弃用警告

    我们有一个应用程序 其中包含一个非常非常古老的类来连接到专有数据库的 API 此代码会生成大量弃用错误 然后将其记录下来 从而污染我们的日志文件 我们只想基本上忽略此供应商提供的类的弃用错误 但我无法找到执行此操作的最佳方法 我见过的选项
  • Bootstrap:两列居中

    我正在尝试使用 Bootstrap 3 1 实现两列居中布局 我读过这个 如何将 Bootstrap div 与 spanX 类居中 https stackoverflow com questions 9554724 how do i ce
  • 使用 Java 从 Keystore 中导入的证书获取公钥

    我已经创建并下载了证书销售队伍 https ap1 salesforce com 按照中的说明PicketLink 文档 https docs jboss org author display PLINK Picketlink as SP
  • 多租户:每个租户都有单独的数据库

    我们正在开发一个多租户应用程序 在架构方面 我们设计了共享中间层用于业务逻辑 每个租户一个数据库用于数据持久化 也就是说 业务层将为每个租户与数据库服务器建立一组连接 连接池 这意味着应用程序为每个租户维护单独的连接池 如果我们预计大约有
  • Android 画图 PorterDuff.Mode.CLEAR

    我正在开发在 Canvas 上绘图的应用程序 类似于 Android SDK 中的 Finger Paint 演示 我的问题是当我使用时PorterDuff Mode CLEAR 当绘图和画布时 如果我尝试擦除某些内容 它工作正常 但如果我
  • 声明参数化类型同义词的实例

    我有很多适用于向量的函数 即具有类型强制长度的列表 我试图让我的类型更容易编写 即而不是编写 foo Fold Integer v Map Integer Integer v v gt 我正在宣布一个新班级NList所以我可以写foo NL