Czy jest możliwe utrzymanie fuzji strumieniowej podczas przetwarzania funkcji vector
, jeśli unsafeUpdate_
jest używana do aktualizacji niektórych elementów vector
? Odpowiedź wydaje się być nie w teście, który zrobiłem. Dla poniżej kodu czasowego wektorów jest generowany w upd
funkcji, co zostało potwierdzone w rdzeniu:Brak fuzji strumienia z unsafeUpdate_ w unboxed wektorze
module Main where
import Data.Vector.Unboxed as U
upd :: Vector Int -> Vector Int
upd v = U.unsafeUpdate_ v (U.fromList [0]) (U.fromList [2])
sum :: Vector Int -> Int
sum = U.sum . upd
main = print $ Main.sum $ U.fromList [1..3]
w rdzeniu $wupd
funkcja jest stosowana w sum
- jak pokazano poniżej, wytwarza nowy bytearray
:
$wupd :: Vector Int -> Vector Int
$wupd =
\ (w :: Vector Int) ->
case w `cast` ... of _ { Vector ipv ipv1 ipv2 ->
case main11 `cast` ... of _ { Vector ipv3 ipv4 ipv5 ->
case main7 `cast` ... of _ { Vector ipv6 ipv7 ipv8 ->
runSTRep
(\ (@ s) (s :: State# s) ->
case >=# ipv1 0 of _ {
False -> case main6 ipv1 of wild { };
True ->
case newByteArray# (*# ipv1 8) (s `cast` ...)
of _ { (# ipv9, ipv10 #) ->
case (copyByteArray# ipv2 (*# ipv 8) ipv10 0 (*# ipv1 8) ipv9)
`cast` ...
Istnieje niezła, ciasna pętla w rdzeniu dla funkcji sum
, ale tuż przed tą pętlą, jest wywołanie funkcji $wupd
, a więc tymczasowe generowanie.
Czy istnieje sposób na uniknięcie tymczasowego generowania w tym przykładzie? Sposób, w jaki o tym myślę, aktualizując wektor w indeksie i jest przypadkiem parsowania strumienia, ale działa tylko na strumień w indeksie i (pomijając resztę) i zastępując element tam innym elementem. Zatem aktualizacja wektora w dowolnej lokalizacji nie powinna przerwać fuzji strumieniowej, prawda?
bok: 'yarr' popiera fuzję i rozwijając wraz ze zmianą w miejscu: http: //hackage.haskell .org/packages/archive/yarr/1.3.1/doc/html/Data-Yarr-Repr-Foreign.html # t: F – leventov
@leventov, bardzo ładnie! Skoro wydajesz się być autorem tej biblioteki, czy byłbyś w stanie podzielić się tym, jak napisać funkcję topikowego uaktualniania w miejscu dla przykładu wektorowego powyżej? Z pewnością to, co zrobiłeś dla szubienicy, powinno mieć zastosowanie tutaj, nie? – Sal
duża, duża wada 'yarr-1. *' Jest ściśle związana z IO. Edycja w miejscu to po prostu 'do {... write arr 0 2; ...} '. – leventov