我正在尝试在 Idris 中编写一个函数,该函数通过传递 Vect 的大小和一个函数以参数中的索引来创建 Vect。到目前为止,我有这个:
import Data.Fin
import Data.Vect
generate: (n:Nat) -> (Nat -> a) ->Vect n a
generate n f = generate' 0 n f where
generate': (idx:Nat) -> (n:Nat) -> (Nat -> a) -> Vect n a
generate' idx Z f = []
generate' idx (S k) f = (f idx) :: generate' (idx + 1) k f
但我想确保传入参数的函数只采用小于 Vect 大小的索引。我试过了:
generate: (n:Nat) -> (Fin n -> a) ->Vect n a
generate n f = generate' 0 n f where
generate': (idx:Fin n) -> (n:Nat) -> (Fin n -> a) -> Vect n a
generate' idx Z f = []
generate' idx (S k) f = (f idx) :: generate' (idx + 1) k f
但它不会与错误一起编译
Can't convert
Fin n
with
Fin (S k)
我的问题是:我想做的事情是否可能以及如何做?