2015-04-20 12 views
6

Nella libreria hybrid-vectors di Edward Kmett sono presenti due moduli principali: Data.Vector.Hybrid e Data.Vector.Mixed. C'è uno big article scritto sulla motivazione dietro il primo. Quest'ultimo è menzionato di passaggio ma manca di spiegazioni. Sto cercando di capire a che tipo di uso è destinato. Ho notato due cose finora:Scopo di Data.Vector.Mixed

  1. C'è una typeclass Mixed con Typeable vincoli. Non capisco la spiegazione negli haddock, ma sembra che i vincoli Typeable debbano essere necessari per ripristinare le informazioni sul tipo o per eseguire il cast in modo sicuro ad un certo punto.
  2. Il tipo di dati Vector è parametrizzato solo sul sottostante MVector. Questo è diverso dal modulo Hybrid in cui è stato parametrizzato su due tipi di vettore più una tupla.

Apprezzerei qualsiasi intuizione utile o (ancora meglio) piccoli esempi di casi d'uso. Grazie.

+0

Non l'ho mai usato prima, ma credo che lo scopo sia solo quello di fornire operazioni che funzionano su tutte le combinazioni di tipi di vettore –

+1

Penso che sto iniziando a capire. Con operazioni come 'head',' length' e 'indexM', questo non fa proprio nulla perché prendono solo un vettore come argomento (e ci sono già versioni di queste funzioni che funzionano su tutti gli altri tipi di vettore). Ma per 'zipWith', sembra un po 'utile perché ci sono due argomenti vettoriali. No, continuo a pensare che mi manchi qualcosa. –

+2

Sì, penso che sia per le cose che richiedono più di un vettore come argomento. Immagino che le altre operazioni siano puramente per completezza (quindi non devi importare anche altri moduli) –

risposta

1

È w/nella mia comprensione che il typesclass Mixed sarebbe consente di utilizzare le funzioni del tipo di sicurezza di poter analizzare, unire e ripiegare attraverso un vettore piuttosto che avere un processo concomitante dove ogni vettore viene analizzato simsimultaneously quindi dichiarare M.Vector g v M.Vector h m in per trovare un punto singleton all'interno di questi vettori e quindi usare il for MVector do |Stream.length g v && Stream h m per trovare un singleton all'interno di ciascuno da piegare con questo tasto key :: mergeStreamwith k d -> Stream k i -> Stream d i instance Singleton key where key = Vector.singleton[ v->(v-> MVector v m) -> MVector m] do transversewithkey g v => key.foldlwithkey g h