【发布时间】:2018-07-12 07:43:00
【问题描述】:
我需要一些帮助来解释有关 Idris 中隐式参数的错误消息以及为什么一个小改动可以修复它。这是代码:
import Data.Vect
myReverse : Vect n elem -> Vect n elem
myReverse [] = []
myReverse {n} (x :: xs)
= let result = myReverse xs ++ [x] in
?rhs
这会导致这个错误:
When checking left hand side of myReverse:
When checking an application of Main.myReverse:
Type mismatch between
Vect (S len) elem (Type of x :: xs)
and
Vect n elem (Expected type)
Specifically:
Type mismatch between
S len
and
n
但是,将{n} 替换为{n = S len},代码类型检查。
我认为使用
{n}只是意味着将函数的隐式n参数带入作用域。为什么会导致错误?错误消息是什么意思?我能想到的唯一解释是,由于将
x::xs模式匹配为S len,类型中的隐式参数n被重写,并且Idris 丢失了这些相同的信息。用
{n = S len}替换它如何工作?
【问题讨论】:
标签: idris