使用 DataKind 在类型签名中绑定名称

2024-01-24

所以,我终于找到了一个可以利用新功能的任务DataKinds扩展(使用 ghc 7.4.1)。这是Vec我在用着:

data Nat = Z | S Nat deriving (Eq, Show)

data Vec :: Nat -> * -> * where
    Nil :: Vec Z a
    Cons :: a -> Vec n a -> Vec (S n) a

现在,为了方便起见,我想实施fromList。简单的递归/折叠基本上没有问题——但我不知道如何给它正确的类型。作为参考,这是 Agda 版本:

fromList : ∀ {a} {A : Set a} → (xs : List A) → Vec A (List.length xs)

我的 Haskell 方法,使用我看到的语法here http://haskell.1045720.n5.nabble.com/Data-Kinds-and-superfluous-in-my-opinion-constraints-contexts-td5689436.html:

fromList :: (ls :: [a]) -> Vec (length ls) a
fromList [] = Nil 
fromList (x:xs) = Cons x (fromList xs)

这给了我一个parse error on input 'a'。我发现的语法是否正确,或者他们是否更改了它?我还添加了一些更多的扩展,这些扩展位于链接的代码中,这也没有帮助(目前我有GADTs, DataKinds, KindSignatures, TypeOperators, TypeFamilies, UndecidableInstances).

我的另一个怀疑是我无法绑定多态类型,但我对此进行了测试:

bla :: (n :: Nat) -> a -> Vec (S n) a
bla = undefined

也失败了Kind mis-match Expected kind 'ArgKind', but 'n' has kind 'Nat'(真的不知道这意味着什么)。

谁能帮我提供一个工作版本fromList并澄清其他问题?很遗憾,DataKinds尚未得到很好的记录,并且似乎假设每个使用它的人都具有深厚的类型理论知识。


Haskell 与 Agda 不同,它没有依赖类型,因此无法完全满足您的需求。类型不能按值参数化,因为 Haskell 强制执行运行时和编译时之间的阶段区别。道路DataKinds从概念上讲,工作实际上非常简单:数据类型是promoted到种类(类型的类型)并且数据构造函数被提升为类型。

 fromList :: (ls :: [a]) -> Vec (length ls) a

有几个问题:(ls :: [a])并没有真正意义(至少当你只是通过提升来伪造依赖类型时),并且length是类型变量而不是类型函数。你想说的是

 fromList :: [a] -> Vec ??? a

where ???是列表的长度。问题是你无法在编译时获取列表的长度......所以我们可以尝试

 fromList :: [a] -> Vec len a

但这是错误的,因为它说fromList可以返回任意长度的列表。相反我们想说的是

 fromList :: exists len. [a] -> Vec len a

但 Haskell 不支持这一点。反而

 data VecAnyLength a where
     VecAnyLength :: Vec len a -> VecAnyLength a 

 cons a (VecAnyLength v) = VecAnyLength (Cons a v)

 fromList :: [a] -> VecAnyLength a
 fromList []     = VecAnyLength Nil
 fromList (x:xs) = cons x (fromList xs)

你实际上可以使用VecAnyLength通过模式匹配,从而获得(本地)伪相关类型值。

相似地,

bla :: (n :: Nat) -> a -> Vec (S n) a

不起作用,因为 Haskell 函数只能接受类型参数*。相反,你可以尝试

data HNat :: Nat -> * where
   Zero :: HNat Z
   Succ :: HNat n -> HNat (S n)

bla :: HNat n -> a -> Ven (S n) a

甚至是可以定义的

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

使用 DataKind 在类型签名中绑定名称 的相关文章

  • 如何比较表中最后一个和倒数第二个条目的值?

    我在 Oracle 中有一个名为quotes 的表 其中包含两列 date 和value 我想比较表中最后一个条目和倒数第二个条目的值 在此示例中 我想获取日期13 1 和 11 1在一行中以及每个日期的值之间的差异 10 5 5 报价表
  • Haskell:无法预期类型“Integer”与实际类型“Int”

    我已经盯着这段代码有一段时间了 但我无法理解该错误消息 divisors Integer gt Integer divisors n t t lt 1 n mod n t 0 length a gt Integer length 0 len
  • 持久 selectList 导致错误“无法将类型‘BaseBackend backend0’与‘SqlBackend’匹配”

    我遇到以下编译错误 Couldn t match type BaseBackend backend0 with SqlBackend arising from a use of runSqlite The type variable bac
  • C 中的复合语句表达式

    下面的代码不起作用 int i void 999 100 添加括号就可以了 为什么 int i void 999 100 还有另一种方法可以完成此类分配 int i void 999 100 是什么让他们与众不同 在这份声明中 int i
  • “单词的正则表达式”(语义替换)-任何示例语法和库吗?

    我正在寻找在给定过程语言的情况下对单词而不是字符进行正则表达式样式转换的常用技术的语法示例 例如 为了追踪复制 人们可能想要创建一份具有相似含义但具有不同单词选择的文档 我希望能够简洁地定义这些可以应用于文本流的可能的转换 例如 快速地no
  • 在依赖类型的函数式编程语言中,扁平化列表是否更容易?

    在 haskell 中寻找一个可以展平任意深度嵌套列表的函数时 即应用的函数concat递归并在最后一次迭代时停止 使用非嵌套列表 我注意到这需要有一个更灵活的类型系统 因为随着列表深度的变化 输入类型也会变化 确实 有几个 stackov
  • 将 num 的签名键入 double?

    我才刚刚开始为你学习 Haskell 以获得伟大的好处 并且我在类型类方面遇到了一些麻烦 我想创建一个接受任何数字类型并强制其为双精度的函数 我的第一个想法是定义 numToDouble Num gt Double 但我认为这不起作用 因为
  • Haskell 中的分类结构

    Hask通常被认为是一个范畴 其对象是类型 态射是函数 然而 我看到 Conor McBride pigworker 警告不要使用Hask多次 1 https stackoverflow com a 45905082 474311 2 ht
  • 如何在 Haskell 中安装库?

    我尝试使用控制 Monad Extra andM https hackage haskell org package extra 1 7 10 docs Control Monad Extra html import Control Mon
  • Java:扩展类并实现具有相同方法的接口

    可能无法完成以下操作 我收到编译错误 继承的方法 A doSomthing int 无法隐藏 B 中的公共抽象方法 public class A int doSomthing int x return x public interface
  • 有没有更好的方法将 UTC 时间转换为大纪元时间?

    我想将文件的修改时间设置为从 exif 数据获取的时间 为了从 exif 获取时间 我发现 Graphics Exif getTag Exif gt String gt IO Maybe String 要设置文件修改时间 我发现 Syste
  • 找不到模块“Yesod”

    我有以下代码 LANGUAGE TypeFamilies QuasiQuotes MultiParamTypeClasses TemplateHaskell OverloadedStrings module Simple where imp
  • JQuery .hasClass 用于 if 语句中的多个值

    我有一个简单的 if 语句 if html hasClass m320 do stuff 这按预期工作 但是 我想添加更多的类if statement检查是否存在任何类标签 我需要它 所以它不是全部 而只是至少一个类的存在 但它可以更多 我
  • : 中缀运算符在 Haskell 中的作用是什么?

    我正在阅读Haskell 简要介绍 http www haskell org tutorial index html 这不是那么温和 并且它反复使用 操作符而不直接解释它的作用 那么 它到底有什么作用呢 是 前置 运算符 x xs 返回一个
  • Haskell 输入返回元组

    我想知道 IO 函数是否可以返回元组 因为我想从这个函数中获取这些元组作为另一个函数的输入 investinput IO gt Char Int investinput do putStrLn Enter Username username
  • Haskell 对于 Web 应用程序来说足够成熟吗? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Data.Sequence 中的 inits 和 tails 如何工作?

    Louis Wasserman 编写了当前的实现inits and tails in Data Sequence 他表示它们非常高效 事实上 只要查看代码 我就可以看到 无论它们在做什么 它们都是以干净 自上而下的方式进行的 这往往会给惰性
  • LESS CSS 语法对现代化很有用

    通常我使用现代化 http modernizr com 了解浏览器的功能 同时 我用LESS CSS http lesscss org 使我的CSS更具可读性和可维护性 使用 LESS 嵌套规则的常见样式如下所示 header color
  • 如何在Haskell中实现词法分析器和解析器

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

    给定一个示例 xml 文件

随机推荐

  • 获取参考位置的符号

    我正在使用SymbolFinder在我的解决方案中查找对某种类型的所有引用 如下所示 ISymbol typeOfInterest compilation GetTypeByMetadataName System Reflection Pr
  • 将远程存储库替换为本地存储库,但保留远程的提交历史记录

    我有一个 Android 存储 在 Github 存储库中 现在我对应用程序进行了完全重写 从另一个存储库中开始 如何 是否可以将完整的新存储库推送到现有存储库 但保留其提交历史记录 我想我不想使用 f 标志 因为提交会被删除 最好的情况是
  • Visual Studio 2010 项目名称.应用程序文件

    当我构建项目时 Visual Studio 还会创建一个名为 MyProject Name application 的文件 这个文件是用来做什么的 如何在 VisualStudio 中禁用此文件的创建 使用 Visual Studio 20
  • 进行眼睛跟踪的通用算法

    所以 我想构建一个可以跟踪学生位置的软件 但我在互联网上找不到解决该问题的数学方法 我想看一些如何计算瞳孔位置的例子 谢谢 我认为最常见的方法是用点光源照亮拍摄对象 并使用角膜上明亮的镜面高光来定位眼球 然后 瞳孔相对于高光的位置将为您提供
  • INSERT INTO 语句中的语法错误

    Dim sqlstr As String insert into users username password values bb ss comand New OleDb OleDbCommand sqlstr con If con St
  • Google Maps API v3 隐藏和显示绑定到标记的圆圈

    我已经使用 google 地图 api v3 成功将一个圆圈绑定到我的标记 我知道这一点是因为如果我使标记可拖动 圆圈也会移动 如果单击标记 我如何引用圆圈 如果圆圈不可见 我需要显示圆圈 反之亦然 这是创建标记和圆圈的代码 var mar
  • java.lang.IllegalArgumentException:pointerIndex超出范围异常-dispatchTouchEvent

    我的自定义视图中有这个方法 它扩展了FrameLayout Override public boolean dispatchTouchEvent MotionEvent ev int currentItem vp getCurrentIte
  • 远程删除之前发送的通知

    自 iOS 10 起UNUserNotificationCenter 通过通知可以实现很多事情 但我不知道如何远程删除推送通知每次 使用mutable content属性 我可以修改推送通知的内容 但假设我想稍后删除它 内容已过期 我用了c
  • 在文本区域内显示 MathML 符号

    我正在 HTML 文件中构建一个基本上是数学文本编辑器的东西 我的目标是允许用户在文本区域中显示数字和 MathML 符号 但完全不使用物理键盘 在页面底部 我有一个模拟键盘 由带有数字和算术符号的按钮组成 当用户单击这些按钮时 相应的数字
  • 有人发现“var”除了用于 LINQ 之外还有其他用途吗?

    只是好奇 我大约 99 999 确信没有 但是有什么吗 编辑 这些都是不错的答案 节省打字时间或使代码不那么冗长以实现 可读性 我想我应该澄清 使用 的含义 一些没有 var 就无法完成的构造 设计 就可读性而言 什么更好 AReallyR
  • 获取滑块的拇指

    我只是想找出一种方法来获取 WPF 中滑块的拇指 如下所示 Slider mySlider new Slider Thumb thumb slider Thumb 现在我知道事情不可能这么简单 但必须有一个解决办法 如果您知道的话请告诉我
  • sequelize 不创建表显示此结果:“执行(默认):SELECT 1+1 AS 结果”

    我尝试使用sequelize 创建一个表 它运行良好 没有错误 但结果不是创建表而是显示此消息 Executing default SELECT 1 1 AS result 这是我的配置文件 const Sequelize require
  • 如何帮助Condor找到它应该在作业中执行的文件?

    我正在尝试执行一项工作 但秃鹰似乎找不到我的文件 我已经确定 通过在其绝对路径上执行 ls 和 cat 即可找到该文件 从Condor交互式会话中运行它 给它正确的权限 以便它运行它 我已经这样做了 但收到此错误 automl meta l
  • Bash 脚本命令在 cron 中不起作用

    我有以下 bash 脚本来读取日志并检查暴力 然后使用 iptables 阻止违规 IP bin bash blah blah run some commands to get the IP iptables A INPUT s p j R
  • 如果使用 C# 的内容长度 > 7kb,则无法在 WebRequest 上发布

    我正在尝试将 Json 发布到我们的网络服务 我的问题是 当我的 request ContentLength 超过 7kb 时 我将在 request GetResponse 处收到 Web 异常 500 但如果我的 request Con
  • 我应该捕获方法引发的所有异常吗?

    try output format d s s 2f n input nextInt input next input next input nextDouble catch FormatterClosedException formatt
  • 传递 url 作为参数

    每当我尝试运行下面的脚本时 我都会得到以下结果 代码有什么问题吗 1 python test py 不打印用法 2 python test py http link com index php title tesst action raw
  • 无法覆盖 android 21 下样式按钮的 textAllCaps

    这就是我设置按钮的方式
  • 导出特定Sheet,并保存不同文件openpyxl

    我正在尝试从 Excel 文件导出特定工作表 但没有结果 我想将一张特定的纸导出到一个全新的文件我写的是 import openpyxl book openpyxl load workbook C Python test xlsx a bo
  • 使用 DataKind 在类型签名中绑定名称

    所以 我终于找到了一个可以利用新功能的任务DataKinds扩展 使用 ghc 7 4 1 这是Vec我在用着 data Nat Z S Nat deriving Eq Show data Vec Nat gt gt where Nil V