1

刚开始使用 Idris(如果重要的话,那就是 Idris 2),然后偶然发现了这个问题。我正在尝试实现一个函数,该函数返回一个由所有斐波那契数组成的向量,直到给定 n。这是到目前为止的定义(它不编译):

fibs : (n : Nat) -> Vect (n + 1) Int
fibs Z = [0]
fibs (S Z) = [0, 1]
fibs (S k) =
    case (fibs k) of
        (x :: y :: xs) => (x + y) :: x :: y :: xs

我得到的错误如下:

Can't solve constraint between:
    S (S ?len)
and
    plus ?_ (fromInteger 1)

错误指向表达式(x :: y :: xs)

我知道我需要向 Idris 证明长度fibs k至少为 2,但我不明白如何做到这一点,以及为什么从现有定义中不明显。对我来说,看起来kinfibs (S k)肯定是 >= 1,否则要么匹配fibs Z要么fibs (S Z)匹配。fibs k因此,根据 的定义, where的长度k >= 1必须 >= 2 fibs : (n : Nat) -> Vect (n + 1) Int。我错过了什么以及如何在 Idris 中表达这一点?

4

1 回答 1

2
于 2020-04-06T15:29:55.677 回答