使用翻转类型参数为用户定义的 Vect 版本实现可折叠
我已经定义了自己的Vect数据类型如下 data MyVect : (n : Nat) -> (t : Type) -> Type where Nil : MyVect Z t (::) : (x : t) -> (xs : MyVect n t) -> MyVect (S n) t 然后开始为数据类型实现Foldable接口 Foldable MyVec... »
我已经定义了自己的Vect数据类型如下 data MyVect : (n : Nat) -> (t : Type) -> Type where Nil : MyVect Z t (::) : (x : t) -> (xs : MyVect n t) -> MyVect (S n) t 然后开始为数据类型实现Foldable接口 Foldable MyVec... »
有没有区别 foo: {len : _} -> Int -> Vect len Int 和 foo: Int -> {len : _} -> Vect len Int 对于数据构造函数、类型构造函数等类似吗?有时我发现我的代码在一个位置使用隐式编译,但在另一个位置却没有,我不太清楚为什么。 ... »
我克隆了this Idris library,它可以通过必要的依赖项正常编译。有一个example/ 目录,它利用了这个库(导入了它的一些模块),它编译和运行也很好。但是,当我尝试在 Atom 中运行 REPL 时,会显示一条熟悉的错误消息: Can't find import Graphics/Util/GlfwConfig 这很有趣,因为当make 被执行时,下面是输出行之一: Ins... »
Xash 在Function to Determine if Nat is Divisible by 5 at Compile-Time 上为我提供了一个有用的答案(我用我原来的长名重新命名): onlyModBy5 : (n : Nat) -> n `modNat` 5 = 0 -> Nat onlyModBy5 n prf = n 以前的answer 教我如何使用Refl 参... »
Idris中的Dec而不是Maybe可以表达什么? 或者换句话说:什么时候应该选择Dec,什么时候应该选择Maybe? 也许你会发现阅读标准库中... »
我想在idris中定义如下函数,学习如何处理否定: absurdity : 0 = 1 -> Void absurdity = ?how 我该怎么做? 我可以创建一个空的 lambda 并让编译器找出这不相等吗?... »
是否有一种简单的方法可以为数据类型编写相等 (DecEq) 实例?例如,我希望在其 DecEq 声明中包含 O(n) 行,其中 ?p 很简单: data Foo = A | B | C | D instance [syntactic] DecEq Foo where decEq A A = Yes Refl decEq B B = Yes Refl decEq C C = Y... »
我首先执行 cabal 更新/升级过程,所以我有 cabal-install-1.20.0.3。然后我做: cabal install idris 我明白了: ... idris-0.9.14.1 (new version) The following packages are likely to be broken by the reinstalls: network-2.5.0.0 H... »
我已经向question 询问了有关 Idris 类型检查 Universe 的方式。现在我正在尝试一些会导致宇宙不一致的例子。这是我能想到的最简单的方法 foo : Type foo = Type bar : Main.foo bar = Main.foo 输出错误是: test.idr:2:5:Universe inconsistency. Working on: z... »
我是依赖类型的新手(我正在尝试 Idris 和 Coq,尽管它们之间存在很大差异)。 我试图表达以下类型:给定一个类型 T 和一个由 k 个 nats n1, n2, ... nk 组成的序列,一个由长度为 n1, n2, 的 T 的 k 个序列组成的类型。 .. nk 分别. 即k个向量的向量,其长度由参数给定。 这可能吗?... »
我一直在研究依赖类型,我了解以下内容: 为什么universal quantification 表示为依赖函数类型。 ∀(x:A).B(x) 表示“对于所有A 类型的x,有一个B(x) 类型的值”。因此,它表示为一个函数,当给定 A 类型的 any 值 x 时,它会返回一个 B(x) 类型的值。 为什么existential quantification 表示为依赖对类型。 ∃(x:A).B(... »
Haskell 允许: a:: Int a = 3 data MyList a = Nil | Cons a (MyList a) 而 Idris 会向 a is bound as an implicit 投诉, 我需要使用不同的类型参数: a: Int a = 3 data MyList b = Nil | Cons b (MyList b)... »
我正在尝试定义一个名为byteWidth 的函数,它捕获了有关“获取特定原子类型的字节宽度”的用法。 我的第一次试用: byteWidth : Type -> Int byteWidth Int = 8 byteWidth Char = 1 而 Idris 编译器抱怨:“检查 byteWidth 的左侧时:左侧没有显式类型:Int” 我的第二次试用: interface BW... »
我想弄清楚如何做一些非常简单的事情:阅读全部将标准输入转换为字符串(或者字符串列表也可以)。 Prelude 有 getLine : HasIO io => io String,它可以给我一条线,但它并没有给我一种知道我已经读完的方法。如果没有更多的输入,它只会给我一个空字符串,这意味着如果输入包含空行,除了输入的末尾我无法分辨。 考虑以下程序: module Example main :... »
人们说依赖类型语言在类型检查方面很慢,所以我认为它在运行类型函数方面很慢。 使用https://idris2.readthedocs.io/en/latest/tutorial/typesfuns.html 上的经典示例 isSingleton : Bool -> Type isSingleton True = Nat isSingleton False = List Nat mkSing... »
我有 Coord 函数将 n 维大小转换为由给定大小限制的坐标类型:Coord [2,3] = (Fin 2, Fin 3)。 import Data.Fin import Data.List Size : Type Size = List Nat Coord : Size -> Type Coord [] = () Coord s@(_ :: _) = foldr1 (,) $ map... »
我创建了一个函数,如果列表是一个带步长 +1 的有序序列,则该函数返回可判定属性。 data Increasing : List Nat -> Type where IncreasingSingle : Increasing [x] IncreasingMany : Increasing (S k :: xs) -> Increasing (k :: S k :: xs) ... »
在“使用 Idris 进行类型驱动开发”一书中,作者解释了如何创建可变参数函数。他以adder 函数为例,该函数使用第一个参数n: Nat,然后添加n + 1 个整数参数。为了声明这个函数,本书引入了依赖类型AdderType,以便于写: adder: (numargs: Nat) -> (acc: Int) -> AdderType numargs 到目前为止一切顺利。但随后提出了... »
我想从 C/C++ 返回一个任意等级的数组给 Idris。我将 C++ 数组键入为 void*,并在 Idris 中相应地有一个 AnyPtr。在 Idris 中,我将这种 Array 类型定义为嵌套的 Vect: Shape : {0 rank: Nat} -> Type Shape = Vect rank Nat Array : (0 shape : Shape) -> Type... »
cong 和 injective 允许您对等式应用和取消应用函数: cong : (f : a -> b) -> x = y -> f x = f y injective : Injective f => f x = f y -> x = y 对于不同长度的索引向量,这两种方法都失败了,原因很明显。 如何证明两个相等的向量具有相同的长度?即 sameLen : {... »