2015-01-22 41 views
8

'un Lens kitaplığındaki ix ve öğe arasındaki fark nedir? Haskell'in objektif kitaplığında, ix ve element sayılı belgelerde her ikisi de bir Int. okumak veya benzer buHaskell

ghci> [1..10] ^? ix 4 
Just 5 
ghci> [1..10] & ix 4 .~ 1 
[1,2,3,4,1,6,7,8,9,10] 

ve benzeri bazı indeksinde bir liste elemanı yazmak için:

ghci> [1..10] ^? element 4 
Just 5 
ghci> [1..10] & element 4 .~ 1 
[1,2,3,4,1,6,7,8,9,10] 

element ve ix arasındaki fark nedir? Eğer sayısına göre, ancak mesela tarafından sadece endeks can ix ile

cevap

11

Haritalar'da anahtar. Sırasıyla element dizini Traverse siparişi.

Fark, örn.

λ> let im = IntMap.fromList [(1, "one"), (2, "two")] 
λ> im ^? ix 1 
Just "one" 
λ> im ^? element 1 
Just "two" 
4

elementIntMap mercek kütüphane bilmediği Traversable sınıf, hatta sınıf üyelerinin türleriyle çalışmak için tanımlanır. Bu şekilde, değer türüne özgü herhangi bir indeks tipine sahip olmayan değere erişmek için sadece Traversable işlevlerini kullanır. Bu nedenle, her zamanki geçiş sırasına elemanlar vererek yalnızca Int endeksleri desteklenir.

element da indeksleri taşıma bazı ekstra yollar sunarak, bir IndexedTraversal verir.

ix

sadece mercek kütüphane bildiği tipleri için tanımlanmış, ancak karşılığında o değerin tipine bağlı farklı indeks türlerini kullanabilirsiniz. listeleri için

onlar aynı sonucu verir. Ancak fark, örn. Data.Map için: Gördüğünüz gibi ix ile bu endeks olarak anahtar türü verilirse ve etrafında bir tür hatası verdiğini geçiş yapmaya çalışırken

Prelude Control.Lens Data.Map> singleton "a" 3 ^? element "a" 

<interactive>:19:28: 
    Couldn't match expected type ‘Int’ with actual type ‘[Char]’ 
    In the first argument of ‘element’, namely ‘"a"’ 
    In the second argument of ‘(^?)’, namely ‘element "a"’ 
    In the expression: singleton "a" 3 ^? element "a" 

Prelude Control.Lens Data.Map> singleton "a" 3 ^? ix "a" 
Just 3 
Prelude Control.Lens Data.Map> singleton "a" 3 ^? element 0 
Just 3 
Prelude Control.Lens Data.Map> singleton "a" 3 ^? ix 0 

<interactive>:22:23: 
    Could not deduce (Num [Char]) arising from the literal ‘0’ 
    from the context (Num a) 
     bound by the inferred type of it :: Num a => Maybe a 
     at <interactive>:22:1-23 
    In the first argument of ‘ix’, namely ‘0’ 
    In the second argument of ‘(^?)’, namely ‘ix 0’ 
    In the expression: singleton "a" 3 ^? ix 0 

, element ile haritası, Int endeks verilir. Bütün bir yapı yürüyüş elemanları sayılabilir ve hedef indeksi ile elemanının geçme

3

element çalışır. Bu nedenle, her zaman yapının boyutunda O (n) zaman karmaşıklığı vardır ve sadece Int endeksleriyle çalışır. Buna karşılık, ixix kendi sınıfına sahiptir ve örnekler belirli veri yapılarının arama/değiştirme işlemlerine dayanır. Örneğin, Data.Sequence için ix, O (log n) 'dir.

Ancak ix sadece belirli veri yapıları üzerinde çalışırken örneğin Traversal, Lens veya Iso herhangi biriyle elementOf eserler:

[0..10] ^? elementOf (reversed . each . filtered odd) 1 
-- Just 7 
+0

teşekkürler. Karmaşıklıktan bahsetmek için +1, aslında bunun için endişelendim. Tamamen mantıklı. Yani mümkün olduğunca ix kullanmalıyız. – Stephan