Rozsądnie wydajny produkt matrycowy w Haskell?

Znam Haskella trochę i zastanawiam się, czy jest możliwe napisanie czegoś w rodzaju produktu macierzowego w Haskell, który jest następujący:

Czysta funkcjonalność: nieIO lubState monady w sygnaturze typu (nie obchodzi mnie, co się dzieje w ciele funkcji.To znaczy, nie obchodzi mnie, czy ciało funkcji używa monad, o ile cała funkcja jest czysta). Mogę użyć tego produktu macierzowo-matrycowego w czystej funkcji.Bezpieczne dla pamięci: bez malloc lub wskaźników. Wiem, że możliwe jest „napisanie C” w Haskell, ale tracisz bezpieczeństwo pamięci. Właściwie napisanie tego kodu w C i połączenie go z Haskellem również traci bezpieczeństwo pamięci.Tak wydajny jak, powiedzmy, Java. Dla konkretności załóżmy, że mówię o prostej potrójnej pętli, pojedynczej precyzji, ciągłym układzie kolumna-główny (float[], niefloat[][]) i macierze o rozmiarze 1000x1000 i jedno-rdzeniowy procesor. (Jeśli otrzymujesz 0,5-2 operacje zmiennoprzecinkowe na cykl, prawdopodobnie znajdujesz się na boisku).

(Nie chcę, żeby to brzmiało jak wyzwanie, ale pamiętaj, że Java może zaspokoićwszystko z powyższego łatwo.)

już to wiem

Implementacja potrójnej pętli nie jest najbardziej wydajna. Jest zupełnie nieświadomy pamięci podręcznej. Lepiej jest użyć dobrze napisanegoBLAS wdrożenie w tym konkretnym przypadku. Jednak nie zawsze można liczyć na dostępność biblioteki C dla tego, co próbuje się zrobić. Zastanawiam się, czy rozsądnie wydajny kod można zapisać w normalnym Haskell.Niektórzy napisali całe prace badawcze, które pokazują # 3. Nie jestem jednak badaczem informatyki. Zastanawiam się, czy w Haskell można utrzymać proste rzeczy.Gentle Introduction to Haskell ma implementację produktu macierzowego. Nie spełniłoby jednak powyższych wymagań.

Adresowanie komentarzy:

Mam trzy powody: po pierwsze, wymóg „no malloc or pointers” jest jeszcze źle zdefiniowany (wzywam cię do napisania dowolnego fragmentu kodu Haskella, który nie używa wskaźników);

Widziałem wiele programów Haskella, których nie używałemPtr. Być może odnosi się to do faktu, że na poziomie instrukcji maszyny będą używane wskaźniki? Nie to miałam na myśli. Miałem na myśli poziom abstrakcji kodu źródłowego Haskell.

po drugie, atak na badania CS jest nie na miejscu (a ponadto nie wyobrażam sobie niczego prostszego niż użycie kodu, który ktoś już napisał dla ciebie); po trzecie, istnieje wiele pakietów macierzy na Hackage (a prace przygotowawcze do zadawania tego pytania powinny obejmować przeglądanie i odrzucanie każdego z nich).

Wygląda na to, że twoje # 2 i # 3 są takie same („użyj istniejących bibliotek”). Jestem zainteresowany produktem macierzowym jako prostym testem tego, co Haskell może zrobić samodzielnie, i czy pozwala on „zachować proste rzeczy”. Mógłbym łatwo wymyślić problem numeryczny, który nie ma żadnych gotowych bibliotek, ale potem musiałbym wyjaśnić ten problem, podczas gdy wszyscy już wiedzą, czym jest produkt macierzowy.

Jak Java może spełniać 1.? Każda metoda Java jest zasadniczo:: IORef Arg -> ... -> IORef This -> IO Ret

Dotyczy to korzenia mojego pytania (+1). Podczas gdy Java nie twierdzi, że śledzi czystość, robi to Haskell. W Javie, czy funkcja jest czysta czy nie, jest wskazana w komentarzach. Mogę twierdzić, że produkt matrycowy jest czysty, nawet jeśli mam mutację w ciele funkcji.Pytanie brzmi, czy podejście Haskella (czystość zakodowana w systemie typu) jest kompatybilne z wydajnością, bezpieczeństwem pamięci i prostotą.

questionAnswers(3)

yourAnswerToTheQuestion