vector
vector
işlevi, vector
öğesinin bazı öğelerini güncellemek için kullanılırsa, akım kaynaşmasını sürdürmek mümkün mü? Cevap, yaptığım testte hayır gibi görünüyor. çekirdekte teyit aşağıdaki kod için geçici vektör, upd
fonksiyon oluşturulur: çekirdeğindeKutulanmamış vektörde unsafeUpdate_ ile akış füzyonu yok
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]
, $wupd
işlevi sum
kullanılır - aşağıda görüldüğü gibi, yeni bytearray
oluşturur:
$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` ...
sum
işlevinde çekirdek için güzel, sıkı bir döngü var, ancak bu döngüden hemen önce, $wupd
işlevine bir çağrı var, ve böylece, geçici bir nesil.
Örnekte geçici üretimden kaçınmanın bir yolu var mı? Bunu düşünürken, bir vektörü dizin içinde güncellemek, bir akışı ayrıştırmaktır, ancak sadece indeks i'de (geri kalanını atlamak) akımın üzerine etki etmek ve öğeyi başka bir elemanla değiştirmek. Bu nedenle, rastgele bir konumda bir vektörün güncellenmesi, akış kaynaşmasını kesmemeli, değil mi?
: http: //hackage.haskell 'yarr' füzyon ve yerinde değiştirme ile birlikte unrolling destekler .org/paketleri/arşiv/yarr/1.3.1/doc/html/Data-Yarr-Repr-Foreign.html # t: F – leventov
@leventov, çok güzel! Bu kütüphanenin yazarı olduğunuza göre, yukarıdaki vektör örneği için yerinde eriyen güncelleme işlevinin nasıl yazılacağını paylaşır mısınız? Elbette, yarr için yaptıkların burada geçerli olmalı, değil mi? – Sal
büyük, 'yarr-1' dezavantajı. '' IO ile sıkıca bağlanmıştır. Yerinde düzenleme sadece 'yapmak {... yazma arr 0 2; ...} '. – leventov