Olası Çoğalt:
Haskell: some and manyAlternative
tipi sınıfında fonksiyonlarsome
vemany
için faydalıdır Ne
Haskell - What is Control.Applicative.Alternative good for?Fonksiyonlar
? Docs, kavrayamadığım özyinelemeli bir tanım sağlar.
Olası Çoğalt:
Haskell: some and manyAlternative
tipi sınıfında fonksiyonlarsome
vemany
için faydalıdır Ne
Haskell - What is Control.Applicative.Alternative good for?Fonksiyonlar
? Docs, kavrayamadığım özyinelemeli bir tanım sağlar.
some
ve many
olarak tanımlanabilir:
some f = (:) <$> f <*> many f
many f = some f <|> pure []
Belki de yardımcı olur
some
monadic
do
sözdizimi ile yazılabilir vereceğini görmek:
some f = do
x <- f
xs <- many f
return (x:xs)
Böylece bir kez some f
çalışır f
ardından "birçok "zamanları ve sonuçları gösterir. many f
, f
"bazı" zamanlarda veya "alternatif olarak", yalnızca boş listeyi döndürür. Buradaki fikir, her ikisi de f
'u "başarısız" olana kadar olabildiğince sık çalıştırıp sonuçların bir liste halinde toplanmasıdır.başarısız olur ve boş listeyi "geri döndürür"başarısız olursa,başarısız olur. Fakat bunun anlamı, tam olarak <|>
'un nasıl tanımlandığına bağlıdır.
Yalnızca ayrıştırma için yararlı mı? Bazdaki örnekler için ne olduğunu görelim: Maybe
, []
ve STM
. İlk Maybe
. Nothing
başarısızlık demektir, bu nedenle some Nothing
başarısız olur ve Nothing
değerlendirir ve many Nothing
Just []
için değerlendirir ve değerlendirir. some (Just())
ve many (Just())
öğelerinin ikisi de hiçbir zaman geri dönmez, çünkü Just()
asla başarısız olmaz! Bir anlamda Just (repeat())
'a değerlendirirler. listeleri için
, []
başarısızlık demektir, bu nedenle many []
[[]]
olarak değerlendirilirse ise some []
[]
(hayır cevapları) olarak değerlendirilir (orada bir cevabıdır ve boş listedir). Yine some [()]
ve many [()]
dönüş yapmaz. Örnekleri genişletmek için some [()]
, fmap (():) (many [()])
ve many [()]
, some [()] ++ [[]]
anlamına gelir; bu nedenle many [()]
'un tails (repeat())
ile aynı olduğunu söyleyebilirdiniz.
STM
için hata, işlemin yeniden denenmesi gerektiği anlamına gelir. Yani some retry
kendini yeniden deneyecek, many retry
ise boş listeye dönecektir. some f
ve many f
, yeniden denemeye başlayana kadar tekrar tekrar f
çalışır. Bunun yararlı bir şey olup olmadığından emin değilim, ama sanırım değil.
Yani, Maybe
, []
ve STM
many
ve some
için bu yararlı olduğu görünmüyor.Uygulamanın, aynı şeyi tekrar tekrar yürütürken başarısızlığa neden olan bir tür devlete sahip olması sadece yararlıdır. Parsers için bu, her başarılı maçta daralan girdi.
E.g. parsing için (bkz. "Örnekle ayrıştırma" bölümü).
Parsec'le aşina değilim. Bir açıklama için minnettar olurum. – missingfaktor
Anlayabildiğim kadarıyla, eğer X için bir “p” ayrıştırıcınız varsa, o zaman “p”, 0 veya daha fazla X için bir ayrıştırıcıdır ve “çok”, 1 veya daha fazla X için ayrıştırıcıdır. – Ingo
@missingfaktor 'some 've' birçok '<|>' olarak uygulanmaktadır. Bu birleştirici başka şekillerde de yararlıdır. "Her İkisini" düşünün: "Sadece 0 <|> Sadece 1 = Sadece 0", "Hiçbir şey <|> Sadece 2 = Sadece 2", "Sadece 3 <|> Hiçbir şey = Sadece 3", "Hiçbir şey <|> Hiçbir şey = Hiçbir şey" – fuz
@Landei: Cevabı o iş parçacığında okudum ve hala anlamadım. – missingfaktor
Sadece bu sorunun bir kopya olduğunu, orijinalinin iyi bir cevabı olduğunu söylemedim :-) Benim için yeterince iyi olmasına rağmen: Bu işlevlerin benim için pek de ilginç olmadığını düşündüm ... – Landei
@Landei: Yaptığın gibi aynı sonuca ulaşıyorum. :-) – missingfaktor