2014-06-28 6 views
5

Myślę specjalnie o przetwarzaniu sygnału. Powiedzmy, że chciałem zrobić coś w rodzaju podwójnej wielkości nadchodzącego sygnału. Chciałbym, żeby był bardzo szybki, więc chciałbym, aby sygnał był trzymany w ciągłej pamięci (na przykład nieskrytych wektorów). Ale ten sygnał mógłby trwać w nieskończoność, więc chciałbym, aby traktowano go jako nieskończoną listę; Wolę zadzwonić pod numer map (*2) signal, zamiast wywoływać go dla każdego fragmentu sygnału.Czy istnieją nieskończone listy z niezakodowaną wydajnością wektorową?

Czy istnieje struktura danych w Haskell, która buforowałaby te porcje danych, aby uzyskać ciągłą wydajność pamięci, ale traktować dane jako strumień nieskończony?

+0

[I zbadać, czy to możliwe, aby zaprojektować Biblioteka DSP jakiś czas temu] (https://github.com/leftaroundabout/timed-media/blob/master/Media/Timed/Audio.hs). (Myślę, że tak jest, przynajmniej możesz zbudować trochę przyzwoitego przykładu melodii ... ale nie zrobiłem na tym dużo poważniejszej pracy). Spękana nieskończona lista, ale bez całej tej księgowości czasu byłaby interesującym projektem na własne prawo. – leftaroundabout

+1

Robią to leniwe bytestiny, z wyjątkiem tego, że mogą przechowywać tylko bajty. Wewnętrznie, leniwy bytestring jest listą rozpakowanych tablic. Nie znam podobnej biblioteki dla innych typów danych. – Heatsink

+0

Leniwe bajki wydają się być dokładnie tym, o co proszę. Wygląda na to, że [ta biblioteka] (http://hackage.haskell.org/package/storablevector-0.2.8.3/docs/Data-StorableVector-Lazy.html) próbuje zrobić to samo, ale z dowolnymi elementami. – awelkie

Odpowiedz

6

To jest po prostu długie ujęcie, ale co z używaniem streams dużych fragmentów nieskrytych wektorów? Miałoby to tę zaletę, że wydajność wektory, a jednocześnie fusion dzięki strumieni.

Aktualizacja: Chodzi o to, aby zdefiniować newtype takich jak:

import Data.Array.Unboxed 
import Data.Stream 
import Data.Word 

newtype Word8Stream = Word8Stream (Stream (UArray Int Word8)) 

a następnie zdefiniować funkcje rodzajowe potrzebne takie jak

smap :: (Word8 -> Word8) -> Word8Stream -> Word8Stream 
smap f (Word8Stream s) = Word8Stream $ fmap (amap f) s 
+0

Rozwiązuje to problem z wydajnością, ale nie mogę traktować strumienia porcji jako jednej długiej listy (lub wektora), czy mogę? Musiałbym użyć map.map zamiast jednego wywołania mapy, jeśli chciałem zastosować funkcję, która oczekuje wektora elementów, prawda? – awelkie

+4

@DurnWhippersnapper Masz rację, ale można to ukryć w typie danych "newtyp" i zestawie odpowiednich funkcji, dzięki czemu wewnętrzna implementacja jest całkowicie nieprzejrzysta dla innych modułów. Zaktualizowałem odpowiedź. –

+0

Po prostu zrób z niego funktora. – PyRulez