idris - 伊德里斯将非线性参数解释为线性
问题描述
我正在使用 Idris2 编写带有 idris 的 TDD 书,在第 6 章中,我们编写了一个函数,可以将动态数量的数字彼此相加。这是我只有Int
s 的 impl:
AdderType : (numargs : Nat) -> Type
AdderType Z = Int
AdderType (S k) = Int -> AdderType k
adder : (numargs : Nat) -> Int -> AdderType numargs
adder Z acc = acc
adder (S k) acc = \next => adder k (next + acc)
请注意,返回 lambda的(S k)
情况。adder
我试图只添加next
到加法器的参数:
adder : (numargs : Nat) -> Int -> AdderType numargs
adder Z acc = acc
adder (S k) acc next = adder k (next + acc)
但是当我尝试编译这个 idris2 给我以下错误。
Error:
While processing right hand side of adder.
Trying to use linear name next in non-linear context.
24 | adder : (numargs : Nat) -> Int -> AdderType numargs
25 | adder 0 acc = acc
26 | adder (S k) acc next = adder k (next + acc)
^^^^
为什么 idris2next
在这种情况下决定它是线性的,而我没有明确表示它是线性的?这是一个错误吗?
注意:如果我对书中列出的更通用的 impl 做同样的事情:
AdderType : (numargs : Nat) -> Type -> Type
AdderType Z numType = numType
AdderType (S k) numType = (next : numType) -> AdderType k numType
adder : Num numType => (numargs : Nat) -> numType -> AdderType numargs numType
adder Z acc = acc
adder (S k) acc next = adder k (next + acc)
我收到以下错误:
Error: While processing left hand side of adder. Unsolved holes:
Tri.{argTy:4060} introduced at:
/home/stefan/dev/tdd-idris/Tri.idr:25:1--25:6
21 | AdderType (S k) numType = (next : numType) -> AdderType k numType
22 |
23 | adder : Num numType => (numargs : Nat) -> numType -> AdderType numargs numType
24 | adder Z acc = acc
25 | adder (S k) acc next = adder k (next + acc)
^^^^^
解决方案
推荐阅读
- powerbi - 如何在矩阵中重复行标签?
- xamarin - 在 Xamarin 表单 TabbedPage 中添加更多选项卡
- java - 将上下文传递给非静态方法 - 我仍然无法做到这一点
- javascript - 为什么 html 表单提交按钮不能在 android 手机上工作但在 pc 上工作?
- reactjs - 用 CSP 反应 CRA:拒绝执行内联脚本
- javascript - 正则表达式匹配句子中的整个单词 - javascript
- java - 将应用程序迁移到云、Tomcat、Java、MySQL - Azure/AWS 选项 LAMP 或服务?
- python - 使用一个 Dataframe 中的最后一个有效数据索引来选择另一个 Dataframe 中的数据
- postgresql - Heroku Pstgres 无法访问数据库中的表
- flutter - 使用 Visual Studio Code 在终端中运行 Dart 控制台应用程序