Próbowałem zaimplementować ogólny algorytm przesuwnego okna na liście elementów. Typowym przypadkiem użycia jest znalezienie największej liczby we wszystkich oknach o długości 5. Lub można policzyć, ile elementów w oknie jest prawdziwe w przypadku niektórych predykatów.Projektując ogólny program okna slajdów w Haskell, potrzebujesz rodziny klasy?
Przesuwne okno przechodzące od lewej do prawej i utrzymanie struktury danych. Element wypada poza okno, które wywołuje remove
na strukturze danych. jeśli nowy element wchodzi w okno, my add
element do struktury danych. Ma także funkcję aggregate
, która oblicza coś na strukturze danych.
Naiwna struktura danych do użycia to kolejka, ale potencjalnie jest możliwe, że ktoś chce użyć innego rodzaju struktury danych do specjalnych zastosowań.
Mój oryginalny pomysł była długa funkcję, która wygląda tak
runSlidingWindow :: (c->(Int,a)->c) -- add
-> (c->(Int,a)->c) -- remove
-> (c->b) -- aggregate
-> c -- identity
-> Int -- width
-> [(Int,a)] -- input
-> [(Int,b)]
Ale zastanawiałem się, istnieją pewne Haskell sposób więc możemy zdefiniować jakąś klasę Window a b c
, tak że możemy przepisać funkcję
runSlidingWindow :: (Window a b c=>WindowInstance a b c)
-> WindowInstance a b c
-> [(Int,a)]
-> [(Int,b)]
runSlidingWindow window input
Oczywiście nie sądzę, że powyższy kod jest prawidłowy. Chcemy wymusić dowolny typ, który jest instancją Window a b c
mieć funkcje postaci
add :: (Window a b c=>WindowInstance a b c)
-> WindowInstance a b c
-> a
-> WindowInstance a b c
remove :: (Window a b c=>WindowInstance a b c)
-> WindowInstance a b c
-> a
-> WindowInstance a b c
aggregate :: (Window a b c=>WindowInstance a b c)
-> WindowInstance a b c
-> b
więc posiadanie tej klasy typu Window a b c
jest ważna, ponieważ pozwala to inni realizują swoje własne okna przesuwne.
Nie jestem świadomy, jak można tego dokonać w Haskell. Myślę, że używając rodziny klasy typu jest to możliwe? Chciałbym zobaczyć przykład.
Nie bardzo rozumiem, co ma znaczyć to "okno", ale może chcesz coś takiego jak [zipper] (http://pl.wikipedia.org/wiki/Zipper_%28data_structure%29) z specjalny element bieżący? – phg
Zmieniłem Twoje pytanie, aby było bardziej czytelne, ale nie podoba mi się poprawienie Twojego nieprawidłowego kodu i ryzyko zmiany znaczenia Twojego pytania. Kiedy piszesz '(Okno a b c => WindowInstance a b c)', co masz na myśli? Mówisz, że 'Window' jest klasą --- czym jest" WindowInstance "? – dave4420
'WindowInstance a b c' byłby typem –