带有 DataKinds 的类型级映射

2023-11-29

我有一个常见的模式,其中有一个类型级别的列表[*],我想应用一种类型构造函数* -> *到列表中的每个元素。例如,我想更改类型'[Int, Double, Integer] to '[Maybe Int, Maybe Double, Maybe Integer].

这是我尝试实现类型级别map.

{-# LANGUAGE TypeFamilies, MultiParamTypeClasses, FlexibleInstances, FlexibleContexts, TypeOperators, DataKinds, ScopedTypeVariables, GADTs #-}

-- turns a type list '[b1, b2, b3]
-- into the type list '[a b1, a b2, a b3]
class TypeMap (a :: * -> *) (bs :: [*]) where
    type Map a bs :: [*]

instance TypeMap a '[b] where
    type Map a '[b] = '[a b]

instance TypeMap a (b1 ': b2 ': bs) where
    type Map a (b1 ': b2 ': bs) = ((a b1) ': (Map a (b2 ': bs)))


data HList :: [*] -> * where
              HNil :: HList '[]
              HCons :: a -> HList as -> HList (a ': as)

class Foo as where
    toLists :: HList as -> HList (Map [] as)

instance Foo '[a] where
    toLists (HCons a HNil) = HCons [a] HNil

instance (Foo (a2 ': as)) =>  Foo (a1 ': a2 ': as) where
    toLists (HCons a as) = 
        let as' = case (toLists as) of
                    (HCons a2 as'') -> HCons [head a2] as'' -- ERROR
        in HCons [a] as'

这会导致错误

Could not deduce (a3 ~ [t0])
    from the context (Foo ((':) * a2 as))
      bound by the instance declaration at Test.hs:35:10-50
    or from ((':) * a1 ((':) * a2 as) ~ (':) * a as1)
      bound by a pattern with constructor
                 HCons :: forall a (as :: [*]).
                          a -> HList as -> HList ((':) * a as),
               in an equation for `toLists'
      at Test.hs:36:14-23
    or from (Map [] as1 ~ (':) * a3 as2)
      bound by a pattern with constructor
                 HCons :: forall a (as :: [*]).
                          a -> HList as -> HList ((':) * a as),
               in a case alternative
      at Test.hs:38:22-34
      `a3' is a rigid type variable bound by
           a pattern with constructor
             HCons :: forall a (as :: [*]).
                      a -> HList as -> HList ((':) * a as),
           in a case alternative
           at Test.hs:38:22
    Expected type: HList (Map [] ((':) * a2 as))
      Actual type: HList ((':) * [t0] as2)
    In the return type of a call of `HCons'
    In the expression: HCons [head a2] as''
    In a case alternative: (HCons a2 as'') -> HCons [head a2] as''

我尝试添加大量类型注释,但错误或多或少都是相同的:GHC 甚至无法推断 HList 的第一个元素是(正常)列表。我在这里做了什么傻事吗?有什么违法的事情吗?或者有什么办法吗?


当你写下TypeMap a (b1 ': b2 ': bs),这与您定义 Map 所做的递归不一致...这只会在您尝试 TypeMap 列表长度不是 1 或 2 个元素时导致错误。另外,在您的情况下,只有一个类型系列会更干净。

type family TypeMap (a :: * -> *) (xs :: [*]) :: [*]
type instance TypeMap t '[] = '[]
type instance TypeMap t (x ': xs) = t x ': TypeMap t xs

请注意,这几乎是以下内容的直接翻译:

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

带有 DataKinds 的类型级映射 的相关文章

  • 嵌套在其他 monad 中的 IO 操作未执行

    我有一个 foobar IO ParseResult String String ParseResult 是一个在这里定义的 monad https hackage haskell org package haskell src exts
  • 如何处理在组合下发生变化的类型?

    我最近读了一篇非常有趣的论文单调性类型 https infoscience epfl ch record 231867 files monotonicity types pdf其中描述了一种新的 HM 语言 该语言可以跟踪操作之间的单调性
  • Haskell 和 Idris 之间的区别:类型宇宙中运行时/编译时的反映

    因此 在 Idris 中 编写以下内容是完全有效的 item b Bool gt if b then Nat else List Nat item True 42 item False 1 2 3 cf https www youtube
  • Haskell 中的类型化抽象语法和 DSL 设计

    我正在 Haskell 中设计 DSL 我想要进行赋值操作 像这样的东西 下面的代码只是为了在有限的上下文中解释我的问题 我没有类型检查 Stmt 类型 data Stmt forall a Assign String Exp a Assi
  • Repa 数组上的并行 mapM

    在我最近的work https github com bgamari mixture model with Gibbs sampling 我一直在充分利用RVar http hackage haskell org packages arch
  • 如何构造 Network.HTTP.Conduit.Request 对象?

    试图构建一个Request with 网络 HTTP 管道 http hackage haskell org packages archive http conduit 1 1 0 1 doc html Network HTTP Condu
  • 计算出类型索引的自由 monad 的细节

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

    通常 当我使用 Haskell 代码时 我会使用类型注释将内容存根并undefined foo String gt Int foo undefined 是否有类型级别的 未定义 我可以以类似的方式使用 理想情况下 与某种注释结合使用 typ
  • 了解函数类型

    我在尝试理解 Haskell 如何确定函数类型时感到有点困惑 这是一个例子 boolFcn x y x 3 y 4 当我检查上述函数的类型时 它给出了结果 Num a1 Num a Eq a1 Eq a gt a gt a1 gt Bool
  • enumFromTo 如何工作?

    我无法将号码添加到Char 以下内容将无法编译 a 1 但是 a z 成功创建一个字符串 其中每个字符值都会递增 有没有一个特殊的函数可以增加Char 我知道我能做到chr ord c 1 如何 a z 或底层enumFromTo函数增加结
  • 无法让 wxHaskell 在 Mac 上从 ghci 工作

    我正在尝试跑步一个例子 http www haskell org haskellwiki WxHaskell Quick start Hello world in wxHaskell using EnableGUI function htt
  • 在 Haskell 中使用 Maybe 类型

    我正在尝试利用 Haskell 中的 Maybe 类型 我有一个查找返回 Maybe 的键 值元组 如何访问 Maybe 包装的数据 例如 我想将 Maybe 包含的整数与另一个整数相加 或者 您可以进行模式匹配 case maybeVal
  • 在 Web.Scotty 中使用 StateT

    我正在尝试制作一个愚蠢的网络服务器 将数据存储为State 我在用着Web Scotty http hackage haskell org package scotty 我之前用过 ReaderT 和 scotty 来访问配置 https
  • 优化计算 200 万以下所有素数总和的 Haskell 代码

    欧拉计划中的问题 10 我在那里看到了一些讨论 但仅限于 C 我用下面的代码来计算 print sum sieve 2 2000000 where sieve sieve x xs x sieve filter 0 mod x xs 需要很
  • Haskell 中的随机枢轴快速排序

    是否有可能在 Haskell 中实现快速排序 使用 RANDOM PIVOT 但仍然有一个简单的Ord a gt a gt a 签名 我开始了解 Monad 目前 我将 monad 解释为某种 命令模式 这对于 IO 非常有用 所以 我知道
  • 自动函子实例

    给定以下代数类型 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
  • 为什么阴谋集团重新安装“总是危险的”?

    使用 Cabal 重新安装软件包时 通常会看到以下警告 警告 请注意 重新安装总是很危险的 无论如何继续 此消息背后的一些原因是什么 目前 重新安装软件包意味着破坏性地覆盖已安装的软件包 如果旧包对系统有任何反向依赖性 它们将不再工作 为了
  • 如何编写将布尔值返回到一个函数的函数

    我在这里发现了一个类似的问题 它问了几乎相同的问题 但又不完全一样 我的问题是如何将 a gt Bool 类型的函数列表组合成一个也是 a gt Bool 的函数 Ex compose a gt Bool gt a gt Bool comp
  • Haskell 程序查找列表中元素的位置

    我需要编写一个函数来查找列表中一个特定元素的位置 我是这样写的 findPos list elt list 1 head list elt 0 otherwise 1 findPos tail list elt 但是如果列表中元素重复怎么办
  • Java 中更高级的泛型

    假设我有以下课程 public class FixExpr Expr

随机推荐

  • 类继承:从继承类的属性重新创建基类项(或实例)

    I have a class A that is inherited from B A 作为我想从 B 修改的一些只读属性 用 new 隐藏这些属性不是一个合适的选择 因为基类有一些使用其自己的属性的函数 不能使用 override 关键字
  • CoffeeScript 模块的模式[重复]

    这个问题在这里已经有答案了 在审查的同时Github 上的 CoffeeScript 源代码 我注意到大多数 如果不是全部 模块定义如下 function call this 这种模式看起来像是将整个模块包装在一个匿名函数中并调用自身 这种
  • 为什么 C++ 中 const 方法不覆盖非常量方法?

    考虑这个简单的程序 class Shape public virtual double getArea 0 class Rectangle public Shape int width int height public Rectangle
  • 是否可以更改 Hive 分区表上列的元数据?

    这是我之前提出的问题的延伸 是否可以更改 HIVE 中的分区元数据 我们正在探索更改表上的元数据的想法 而不是对 SELECT 语句中的数据执行 CAST 操作 更改 MySQL 元存储中的元数据非常简单 但是 是否可以将该元数据更改应用于
  • 注册我的广播接收器以在应用程序启动时运行?

    我想在启动应用程序时运行一些代码 因此当用户打开任何应用程序时必须通知我的广播接收器 有什么办法可以做到吗 不 抱歉 应用程序启动时或活动启动时都不会广播 Intent
  • 从 C# 调用 PHP Web 服务

    我目前正在尝试用 C 调用 PHP Web 服务 我一直在尝试在互联网上找到的数十种解决方案 但没有运气 并且没有一个与我有相同的问题 我对PHP不熟悉 我可以从我的 C 成功调用authenticate get string auth i
  • 如何注入EPartService

    我正在开发 e4 应用程序 我想在 Part 和 Handler 之外注入 EPartService 当我注入 EPartService 时 我会得到空指针错误 public class DisplayRuntimePart Inject
  • 更改 Java 中的当前工作目录?

    如何从 Java 程序中更改当前工作目录 我能找到的有关该问题的所有内容都表明您根本无法做到这一点 但我不敢相信事实确实如此 我有一段代码 它使用硬编码的相对文件路径从通常启动的目录中打开一个文件 我只是希望能够在不同的 Java 程序中使
  • 如何解开双可选?

    如何解开返回的字符串 可选 可选 蓝色 var cityName String if let cityAnno annotation as MGLAnnotation cityName String stringInterpolationS
  • 标头是什么?

    什么是
  • 从 LibreOffice Basic 调用 C 共享库函数

    我试图从 LibreOffice Basic 调用 C 共享库函数 但当它到达 Declare 行时 我总是收到 基本运行时错误 未实现 这只是为了一件有趣的事情 但无法做到这一点让我很烦恼 Declare 语句如下所示 Declare F
  • Erlang 及其堆内存消耗

    我一直在 HP Proliant 服务器上运行高度并发的应用程序 该应用程序是我用 erlang 编写的文件系统索引器 它为在文件系统上找到的每个文件夹生成一个进程 并将所有文件路径记录在碎片化的 Mnesia 数据库中 数据库由disc
  • CSS 填充剩余容器宽度

    我有这个标题栏 我需要名为 middle 的元素来填充 div 中剩余的空白 我该怎么做 header background red middle background orange display inline block right b
  • 通过 App Delegate 在视图之间共享数据

    我有一个关于在视图之间共享数据的问题 希望它不是太基础 我在 appDelegate 中有一个 NSMutableArray 其中包含 Object1 Object2 Object3 创建新对象 并将其添加到数组中 时 我需要在下一个视图上
  • 从 ruby​​ 内部加密数据包,无需依赖 Knife

    目前要加密数据包 我必须这样做 system knife data bag from file TemporaryEncrypting enc file path secret file Secret Key Path 这不起作用 因为 K
  • 是否可以使 Page.IsPostBack 独立于 ASP.net 为真?

    如果检查用户的角色以确定他们是否可以访问某个页面 则仅将此检查放在一个页面中是否安全 if Page IsPostBack 是否有可能client引起Page IsPostBack true独立于 ASP net 也就是说 客户端 POST
  • 从我的计算机python中提取子网掩码

    亲爱的 我打算提取我的子网掩码 我使用了下面的代码 但子网掩码始终是 255 255 255 255 这是错误的 import socket Import socket module import netifaces def get ip
  • ActionLink 或 BeginForm 提交中不弹出 AjaxOptions.confirm

    这是新手 所以如果我在另一个答案中错过了这一点 请耐心等待 我尝试在 Ajax BeginForm 中使用 AjaxOptions 但它没有弹出 所以我转而在 ActionLink 中测试它 但仍然无法让它工作 对于 ajax beginf
  • Java 字符串分割不起作用

    Java 专家 请查看下面的 split 命令代码 并让我知道为什么最后两个空值未被捕获 String test 1 O1 0 0000 0 0000 String splittest test split System out print
  • 带有 DataKinds 的类型级映射

    我有一个常见的模式 其中有一个类型级别的列表 我想应用一种类型构造函数 gt 到列表中的每个元素 例如 我想更改类型 Int Double Integer to Maybe Int Maybe Double Maybe Integer 这是