2011-10-06 11 views
15

Olası Çoğalt:
Haskell: some and manyAlternative tipi sınıfında fonksiyonlar some ve many için faydalıdır Ne
Haskell - What is Control.Applicative.Alternative good for?Fonksiyonlar

? Docs, kavrayamadığım özyinelemeli bir tanım sağlar.

+0

@Landei: Cevabı o iş parçacığında okudum ve hala anlamadım. – missingfaktor

+0

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

+0

@Landei: Yaptığın gibi aynı sonuca ulaşıyorum. :-) – missingfaktor

cevap

33

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 NothingJust [] 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 STMmany 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.

8

E.g. parsing için (bkz. "Örnekle ayrıştırma" bölümü).

+2

Parsec'le aşina değilim. Bir açıklama için minnettar olurum. – missingfaktor

+2

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

+2

@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