parametresinde indeks işlevini alan bir "vect generator" fonksiyonu nasıl yazılırım İdris'te Vect'in boyutunu geçirerek bir Vect yaratan bir fonksiyon ve indeksi alan bir fonksiyon yazmaya çalışıyorum parametresinde.İdriste,
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
Ama parametresinde geçirilen işlevi yalnızca vect boyutundan daha az endeks baz alınarak sağlamak istiyoruz: Şimdiye kadar, ben bu ettik.
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
Ama
Can't convert
Fin n
with
Fin (S k)
Sorum şu hata ile derleme değil: Denedim ben mümkün yapmak istediğiniz şey ne ve nasıl?
Bir yanıtım yok, ancak iki şeyi not etmiyorum: 1. "Sayım" işlevini uygularsanız, n: Nat alır ve [FZ, ...] vektörünü verir. n-1] ', sonra' map' kullanarak işlevinizi oluşturabilirsiniz. 2. Vektörleri tersine çevirmek için bir fonksiyon yazmak çok zor değil, bu yüzden "geri say" fonksiyonunu yazmanın bir yolunu bulursanız, geri saymak için sonucunu tersine çevirebilirsiniz. – dfeuer
Başka bir düşünce (belki daha iyi). Her zaman bir "Fin n" yi "Fin (m + n)" ye "zayıflatabilirsiniz". Bu yüzden bir fikir yukarı doğru giden bir argüman ve bir argümanın aşağı inmesi ile çalışmak olabilir ve toplamlarını kanıtlayan bir argüman doğrudur. – dfeuer