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))
Set
s 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 Set
s, 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 Set
s 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
Set
karşı başka bir argüman olmakFunctor
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
JUnit karışıklık: 'uzatmak deneme...
Nasıl kullanıcı duruyorsun.farklı derl...
Evresel Java Ayarlar farklı...
Python ayarlar json seri hale getirile...
Visual studio penceresi ayarları unutu...