如何解决Agda:返回列表的最后一个元素
当我签入 **********************
* Accellerated build *
**********************
running bdist_wheel
running build
running build_py
creating build
creating build\lib.win-amd64-3.9
creating build\lib.win-amd64-3.9\yarl
copying yarl\_quoting.py -> build\lib.win-amd64-3.9\yarl
copying yarl\_quoting_py.py -> build\lib.win-amd64-3.9\yarl
copying yarl\_url.py -> build\lib.win-amd64-3.9\yarl
copying yarl\__init__.py -> build\lib.win-amd64-3.9\yarl
running egg_info
writing yarl.egg-info\PKG-INFO
writing dependency_links to yarl.egg-info\dependency_links.txt
writing requirements to yarl.egg-info\requires.txt
writing top-level names to yarl.egg-info\top_level.txt
reading manifest file 'yarl.egg-info\SOURCES.txt'
reading manifest template 'MANIFEST.in'
warning: no previously-included files matching '*.pyc' found anywhere in distribution
warning: no previously-included files matching '*.cache' found anywhere in distribution
warning: no previously-included files found matching 'yarl\*.html'
warning: no previously-included files found matching 'yarl\*.so'
warning: no previously-included files found matching 'yarl\*.pyd'
no previously-included directories found matching 'docs\_build'
writing manifest file 'yarl.egg-info\SOURCES.txt'
copying yarl\__init__.pyi -> build\lib.win-amd64-3.9\yarl
copying yarl\_quoting_c.c -> build\lib.win-amd64-3.9\yarl
copying yarl\_quoting_c.pyi -> build\lib.win-amd64-3.9\yarl
copying yarl\_quoting_c.pyx -> build\lib.win-amd64-3.9\yarl
copying yarl\py.typed -> build\lib.win-amd64-3.9\yarl
running build_ext
building 'yarl._quoting_c' extension
error: Microsoft Visual C++ 14.0 or greater is required. Get it with "Microsoft C++ Build Tools": https://visualstudio.microsoft.com/visual-cpp-build-tools/
----------------------------------------
ERROR: Failed building wheel for yarl
Failed to build multidict yarl
ERROR: Could not build wheels for multidict,yarl which use PEP 517 and cannot be installed directly
时,我发现没有agda-stdlib/src/Data/List/Base.agda
函数,但是我在last
中看到了agda-stdlib/src/Data/Vec/Base.agda
的函数。
当我尝试使用它时,尽管出现一些不确定的类型错误,但我不确定。
这就是我要称呼它的方式:
last
其中
last (fromList todos)
和
todos : List Todo
我得到的错误是
record Todo : Set where
field
text : String
completed : Bool
id : ℕ
我猜想这与Data.List.foldr (λ _ → suc) 0 todos != suc _n_31 of type ℕ
when checking that the expression fromList todos has type
Data.Vec.Vec Todo (1 + _n_31)
具有此签名的事实有关:
last
但是我很困惑,因为当我在last : ∀ {n} → Vec A (1 + n) → A
上执行以下操作时:
C-c C-l
我实现了这个目标
last (fromList ?)
我以为?0 : List Todo
满意。
我应该在此处进行哪些更改以使其通过此错误?
还是有另一种方式获取todos
的最后一个元素?
谢谢!
编辑
我尝试了另一条路线,并决定将List
替换为Vec
。但是,当我尝试这样做时,我遇到了另一个我不太了解的错误
List
Todo.completed (last (todos ∷ʳ record { text = text ; completed = false ; id = 1 }))
≡⟨⟩
Todo.completed (record { text = text ; completed = false ; id = 1 })
我不确定错误消息在这里说什么。
编辑
我试图进一步简化问题
false !=
Todo.completed
(last
(todos ∷ʳ record { text = text ; completed = false ; id = 1 })
| Data.Vec.initLast
(todos ∷ʳ record { text = text ; completed = false ; id = 1 }))
of type Bool
when checking that the inferred type of an application
false ≡ _y_45
matches the expected type
Todo.completed
(last
(todos ∷ʳ record { text = text ; completed = false ; id = 1 }))
≡ false
但我仍然收到类似的错误:
AddNat : ∀ {n : ℕ} → (Vec ℕ n) → (Vec ℕ (1 + n))
AddNat numbers = numbers ∷ʳ 1
AddNatLastAddedElementIsNat :
∀ {n : ℕ} (numbers : Vec ℕ (1 + n)) →
last (AddNat numbers) ≡ 1
AddNatLastAddedElementIsNat numbers =
begin
last (AddNat numbers)
≡⟨⟩
last (numbers ∷ʳ 1)
≡⟨⟩
1
∎
为什么1 != (last (numbers ∷ʳ 1) | Data.Vec.initLast (numbers ∷ʳ 1)) of
type ℕ
when checking that the expression 1 ∎ has type
last (numbers ∷ʳ 1) ≡ 1
显示为last (numbers ∷ʳ 1)
类型? (last (numbers ∷ʳ 1) | Data.Vec.initLast (numbers ∷ʳ 1))
是否表示它是求和类型,并且我需要在两种情况下都进行模式匹配?谢谢!
解决方法
fromList ?0
中的目标确实具有类型List Todo
,但是由于fromList ?0
具有类型Vec _ (length ?0)
,如果类型检查器得出结论认为不能否n
使得length ?0
(在定义上)等于1 + n
。
就您而言,一旦您说出?0 := todos
,类似?0 := x ∷ todos
这样的事情就会发生。
通常,像last
这样的函数需要知道列表或向量是非空的,另一种方法是定义返回Maybe A
而不是A
的函数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。