SORU
4 EKİM 2013, Cuma


Ayarlar, Funktorlar ve Eq karışıklık

Bir tartışma son zamanlarda bu hatalar, örneğin yol açabilir nasıl Scala zip yöntemi destekleyen Ayarlar, ve oldu da

scala> val words = Set("one", "two", "three")
scala> words zip (words map (_.length))
res1: Set[(java.lang.String, Int)] = Set((one,3), (two,5))

Sets elemanları sıralanır beri zip operasyon destek gerekmiyor bu oldukça açık olduğunu düşünüyorum. Ancak, sorun Set gerçekten bir functor değil önerdi, ve map bir yöntem olmamalı. Kesinlikle, sorun kendinizi bir set eşleme üzerinden alabilirsiniz. Şimdi Haskell geçiş

data AlwaysEqual a = Wrap { unWrap :: a }

instance Eq (AlwaysEqual a) where
    _ == _ = True

instance Ord (AlwaysEqual a) where
    compare _ _ = EQ

ve ghci artık

ghci> import Data.Set as Set
ghci> let nums = Set.fromList [1, 2, 3]
ghci> Set.map unWrap $ Set.map Wrap $ nums
fromList [3]
ghci> Set.map (unWrap . Wrap) nums
fromList [1, 2, 3]

Set functor yasanın gereklerini yerine getirmek için başarısız olur

    fmap f . fmap g = fmap (f . g)

Olabilir savundu bunun başarısız map operasyon Sets, ama başarısız Eq örnek olduğunu tanımladık, çünkü değil saygı değiştirme Yasası, yani bu iki örneği Eq A ve B ve bir eşleme f : A -> B

    if x == y (on A) then f x == f y (on B)

AlwaysEqual (f = unWrap örneğin düşünün) tutmaz.

Yer değiştirme yasalara uymak için denemeliyiz Eq türü için mantıklı bir kural mı var? Kesinlikle, diğer eşitlik yasaları değiştirme başımız derde tek yer AlwaysEqual türü (simetri, geçişlilik ve deneyimlerin yaşanabileceğini basit olan memnun) tarafından saygı.

Bana, yer değiştirme Eq sınıf için çok cazip bir özellik gibi görünüyor. Diğer taraftan, recent Reddit discussion bazı açıklamalar vardır

"Değişimi gerekli daha güçlü gibi görünüyor, ve temelde bu tür quotienting, her işlev gereksinimleri türünü kullanarak koyuyor."

--godofpumpkins

"Ben de gerçekten değiştirme/eşit olmayan değerler için birçok meşru kullanım alanları vardır ama bir şekilde ayırt edilebilir olduğundan, sözüne istemiyorum."

--sclv

"İkame sadece yapısal eşitlik için de geçerlidir, ama hiçbir şey Eq yapı olduğunda ısrar ediyor."

--edwardkmett

Bu üçü oldukça iyi Haskell bilindiğini, onlara karşı gelmek ve Eq türlerim için substitability ısrar için tereddüt ediyorum!

Set karşı başka bir argüman Functor yaygın Functor - "" "" şeklini koruyarak. toplama elemanları dönüştürmek için izin veren kabul edilir Örneğin, bu Haskell wiki (Traversable Functor bir genelleme olduğunu unutmayın) alıntı

"Nereye Foldable verir yeteneği geçmek yapısı işlem elemanları ama uzağa atma şekli, Traversable sağlar bunu yaparken koruma şekli ve, örneğin, koyarak yeni değerler."

"Traversable olarak-tam olarak yapısını korumak."

ve Gerçek Dünyada Haskell

"...[A] functor şeklini korumak gerekir. Koleksiyon yapısı bir functor etkilenmemelidir; içerdiği sadece değerleri değiştirmek gerekir."

Açıkça, Set herhangi bir functor örneği şekil değiştirme yeteneği, bu kümedeki öğe sayısını azaltarak.

Ama olsa Sets dürüst olmalı funktorlar (görmezden Ord gereksinim için an - ben gördüğünüz gibi yapay bir kısıtlama empoze ederek arzu en verimli setleri, mutlak bir ihtiyaç için herhangi bir set. Örneğin, fonksiyon kümeleri dikkate almak son derece mantıklı bir şey. Her durumda, Oleg Ord bir kısıtlama gerektirir) Set verimli Functor ve Monad örnekleri nasıl yazılır 74**. Onlar için çok güzel kullanır (aynı-var olmayan Monad örnek için geçerlidir).

Herkes bu pisliği temizlemek? Set Functor olmalıdır? Eğer öyleyse, bir Functor yasaları ihlal için potansiyel hakkında ne yapıyor? Eq için yasalar ve nasıl Functor için yasalar ve özellikle Set örneği ile etkileşimde bulunurlar? ne olmalıdır

CEVAP
5 EKİM 2013, CUMARTESİ


Set karşı başka bir argüman olmak Functor Geniş Functor - "" "" şeklini koruyarak. toplama elemanları dönüştürmek için izin veren kabul edilir [...] Net bir şekilde Ayarlamak için herhangi bir functor örneği şekil değiştirme yeteneği, bu kümedeki öğe sayısını azaltarak.

Bu "şekil" değil belirleyici bir koşul olarak benzetme. almak korkuyorum Matematiksel güç eşleme diye bir şey yoktur. From Wikipedia:

Güç ayarlar:Güç functor P ayarlayın :Set Seçeneğine Ayarlayınharitalar her güç ayarlayın ve her bir fonksiyon f : X → U ⊆ imajını X f(U) Gönderen haritaya Y ⊆ Y

Fonksiyonu P(f) (güç ayarlamafmap f functor) bağımsız değişken kümesi boyutunu korumaz, ancak bu yine de bir functor.

Eğer hasta kabul sezgisel benzetme, diyebiliriz bu: bir yapı gibi bir liste, her elemanın "umurunda" konusundaki ilişkinin diğer unsurları, ve olurdu "rahatsız" eğer bir yanlış functor vardı çok uzun sürmedi ilişkimiz. Ama bir sınırlayıcı durum: bir yapı olan unsurlardır kayıtsız birbirlerini çok çok az için "hakaret" onlara; tek şey ise bir yanlış functor olduğunu harita bir set içeren bir öğe için bir neden yok vardır onun "ses."

(Tamam, şimdi susuyorum...)


DÜZENLEME:Benim cevabım başında senden bahsettiğimde aşağıdaki parçaları kesildi:

Örneğin, bu Haskell wiki (Traversable Functor bir genelleme olduğunu unutmayın) alıntı

"Nereye Foldable verir yeteneği geçmek yapısı işlem elemanları ama uzağa atma şekli, Traversable sağlar bunu yaparken koruma şekli ve, örneğin, koyarak yeni değerler."

"Traversable olarak-tam olarak yapısını korumak."

Traversable bir tür söz ediyorum buradauzmanFunctor, "genelleme" değildir. Bir temel gerçekler hakkında herhangi bir Traversable (ya da, aslında, hakkında Foldable, Traversable uzatır) bunu gerektirir elemanlarının herhangi bir yapıya sahip bir doğrusal sipariş—turn herhangi bir Traversable bir liste öğeleri (Foldable.toList).

Başka, daha az Traversable çok belli aslında aşağıdaki fonksiyonları mevcut (Gibbons & Oliveira, "The Essence of the Iterator Pattern" uyarlanmıştır):

-- | A "shape" is a Traversable structure with "no content," 
-- i.e., () at all locations.
type Shape t = t ()

-- | "Contents" without a shape are lists of elements.
type Contents a = [a]

shape :: Traversable t => t a -> Shape t
shape = fmap (const ())

contents :: Traversable t => t a -> Contents a
contents = Foldable.toList

-- | This function reconstructs any Traversable from its Shape and
-- Contents.  Law:
--
-- > reassemble (shape xs) (contents xs) == Just xs
--
-- See Gibbons & Oliveira for implementation.  Or do it as an exercise.
-- Hint: use the State monad...
--
reassemble :: Traversable t => Shape t -> Contents a -> Maybe (t a)

Ayarlar için Traversable örnek boş olmayan tüm ayarlar [()]olan Shape-aynı olurdu çünkü yasa ihlal. Bu 70 ** bir ayarlamak için çalıştığınızda zaman sadece hiç boş küme ya da tek bir geri alacağı ispat için kolay olmalıdır.

Ders? Traversable "" 72* *geliyor. Daha çok özel, güçlü bir anlamda şeklini korur

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • BumbleDroid

    BumbleDroid

    18 EKİM 2010
  • Matt Davis

    Matt Davis

    4 ŞUBAT 2006
  • The White House

    The White Ho

    21 Ocak 2006