Idris:函数使用 Nat 参数,但使用 Integer 参数时类型检查失败

2024-01-09

我是伊德里斯的新手。我正在尝试类型,我的任务是制作一个“洋葱”:一个带有两个参数的函数:一个数字和任何东西,并将任何东西放入List嵌套了这么多次。

例如,结果为mkOnion 3 "Hello World"应该[[["Hello World"]]]。 我做了这样一个功能,这是我的代码:

onionListType : Nat -> Type -> Type
onionListType Z b = b
onionListType (S a) b = onionListType a (List b)

mkOnionList : (x : Nat) -> y -> onionListType x y 
mkOnionList Z a = a
mkOnionList (S n) a = mkOnionList n [a]

prn : (Show a) => a -> IO (); 
prn a = putStrLn $ show a;

main : IO()
main = do
    prn $ mkOnionList 3 4
    prn $ mkOnionList 2 'a'
    prn $ mkOnionList 5 "Hello"
    prn $ mkOnionList 0 3.14

程序工作结果:

[[[4]]]  
[['a']]  
[[[[["Hello"]]]]]  
3.14

这正是我所需要的。 但是当我做同样的事情,但是像这样将 Nat 更改为 Integer

onionListTypeI : Integer -> Type -> Type
onionListTypeI 0 b = b
onionListTypeI a b = onionListTypeI (a-1) (List b)

mkOnionListI : (x : Integer) -> y -> onionListTypeI x y 
mkOnionListI 0 a = a
mkOnionListI n a = mkOnionListI (n-1) [a]

我收到错误:

When checking right hand side of mkOnionListI with expected type   
    onionListTypeI 0 y

Type mismatch between  
    y (Type of a) and   
    onionListTypeI 0 y (Expected type)

为什么类型检查失败?

我认为这是因为Integer可以取负值并且Type负值时无法计算。如果我是对的,编译器如何理解这一点?


你是对的,类型无法计算。但那是因为onionListTypeI不是全部。你可以在 REPL 中检查这一点

*test> :total onionListTypeI
Main.onionListTypeI is possibly not total due to recursive path:
    Main.onionListTypeI, Main.onionListTypeI

(或者甚至更好,要求%default total在源代码中,这会引发错误。)

因为类型构造函数不是完整的,所以编译器不会规范化onionListTypeI 0 y to y。由于情况原因,这并不完全onionListTypeI a b = onionListTypeI (a-1) (List b)。编译器只知道从 a 中减去 1Integer结果到Integer,但不是确切的数字(与使用Nat)。这是因为算术与Integer, Int, Double以及各种Bits定义了主要函数,例如prim__subBigInt。如果这些函数不是盲目的,编译器应该会遇到负值问题,就像您假设的那样。

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

Idris:函数使用 Nat 参数,但使用 Integer 参数时类型检查失败 的相关文章

  • 在 Coq 中实现向量加法

    在某些依赖类型语言 例如 Idris 中实现向量加法相当简单 根据维基百科上的例子 import Data Vect default total pairAdd Num a gt Vect n a gt Vect n a gt Vect n
  • 如何在 Idris 中表达范围有效性?

    我正在尝试在 Idris 中构建一个简单的调查表单 目前正在努力验证用户输入 该输入以字符串形式出现 所提出问题的类型 目前我有以下几种类型 data Question Type where QCM numOptions Nat gt qu
  • 在编译时确定 Nat 是否能被 5 整除的函数

    Using Cactus有帮助answer 我尝试编写一个函数 给定一个Nat 将返回Nat如果它能被整除5 onlyModBy5Helper n Nat gt k Nat k mod 5 0 gt Nat onlyModBy5Helper
  • 代表自由团体的好方法是什么?

    很容易表示自由岩浆 二叉叶树 自由半群 非空列表 和自由幺半群 列表 并且不难证明它们实际上就是它们所声称的那样 但自由团体似乎要棘手得多 似乎至少有两种方法可以使用通常的方法List Either a 表示 将要求编码为类型 如果您有Le
  • 类型参数和索引之间的区别?

    我是依赖类型的新手 对两者之间的区别感到困惑 似乎人们通常说类型是由另一种类型参数化 and 按某个值索引 但是 在依赖类型语言中 类型和术语之间不是没有区别吗 参数和指数之间的区别是根本性的吗 您能否举例说明它们在编程和定理证明中的含义差
  • 什么是累积宇宙和“* : *”?

    在阿格达 有Set n 我认为 Set n将 Haskell 风格的值类型种类层次结构扩展到无限级别 那是 Set 0是正常类型的宇宙 Set 1是正常类型的宇宙 Set 2是正常类型的宇宙 等等 相比之下 伊德里斯拥有所谓的 宇宙累积层次
  • Idris:函数使用 Nat 参数,但使用 Integer 参数时类型检查失败

    我是伊德里斯的新手 我正在尝试类型 我的任务是制作一个 洋葱 一个带有两个参数的函数 一个数字和任何东西 并将任何东西放入List嵌套了这么多次 例如 结果为mkOnion 3 Hello World 应该 Hello World 我做了这
  • 如何实现参数化元组的“Show”接口?

    I have Coord将 n 维大小转换为给定大小限制的坐标类型的函数 Coord 2 3 Fin 2 Fin 3 import Data Fin import Data List Size Type Size List Nat Coor
  • 当 Idris 中的 lambda 抽象相关类型时,如何证明“看似显而易见”的事实?

    我正在 Idris 中编写一个基本的单子解析器 以习惯其语法以及与 Haskell 的差异 我的基础知识工作得很好 但我坚持尝试为解析器创建 VerifiedSemigroup 和 VerifiedMonoid 实例 言归正传 这里是解析器
  • 函数类型中的 Plus 与 S

    以下向量声明cons cons a gt Vect n a gt Vect n 1 a cons x xs x xs 因错误而失败 Type mismatch between S n and plus n 1 而下面的向量append编译并
  • (xs : Vect n elem) -> Vect (n * 2) elem

    这本书使用 Idris 进行类型驱动开发 https www manning com books type driven development with idris提出这个练习 定义一个适合签名的可能方法 two xs Vect n el
  • 在Refl中使用重写

    我正在使用 Idris 学习第 8 章类型驱动开发 我有一个关于 rewrite 如何与 Refl 交互的问题 此代码作为重写如何在表达式上工作的示例显示 myReverse Vect n elem gt Vect n elem myRev
  • 使用异质等式 =

    到目前为止我所拥有的是 module Foo postulate P P postulate NP NP complexityProof P NP complexityProof complexityProof rhs 但在尝试加载文件时
  • 无法声明 MonadPlus 接口受 Monad 约束

    我试图像这样声明 MonadPlus 接口 module NanoParsec Plus access public export interface Monad m gt MonadPlus m where zero m a plus m
  • 为什么在这种情况下重写不改变表达式的类型?

    在 1 中可以阅读下一篇 rewrite prf in expr 如果我们有prf x y 并且 expr 所需的类型是以下属性x the rewrite in语法将搜索x在所需的类型中expr并将其替换为y 现在 我有下一段代码 您可以将
  • 约束接口中的函数参数

    在接受函数的接口中约束函数参数的语法是什么 我试过 interface Num a gt Color f a gt Type where defs 但它说Name a is not bound in interface Your inter
  • 为什么较新的依赖类型语言没有采用 SSReflect 的方法?

    我在 Coq 的 SSReflect 扩展中发现了两个约定 它们似乎特别有用 但我还没有看到它们在较新的依赖类型语言 Lean Agda Idris 中得到广泛采用 首先 可能的谓词被表示为布尔返回函数而不是归纳定义的数据类型 默认情况下
  • 在 Idris 中,我可以证明自由定理吗? `forall t 类型的唯一(全部)函数。 t -> t` 是 `id`?

    对于足够多态的类型 参数性可以唯一地确定函数本身 参见瓦德勒的定理免费 http www cs sfu ca CourseCentral 831 burton Notes July14 free pdf了解详情 例如 唯一具有类型的总函数f
  • 为什么这个“with”块会破坏这个函数的整体性?

    我正在尝试在自然数上计算奇偶校验和一半的下限 data IsEven Nat gt Nat gt Type where Times2 n Nat gt IsEven n n n data IsOdd Nat gt Nat gt Type w
  • Idris - 自定义相关数据类型上的映射函数失败

    我对 idris 和依赖类型相对较新 遇到了以下问题 我创建了一个类似于向量的自定义数据类型 infixr 1 data TupleVect Nat gt Nat gt Type gt Type where Empty TupleVect

随机推荐