2016-10-11 29 views
6

Haskell kitabu yaklaşık MonadPlus okurken, temelde başka türlü bir Char ve String alır ve alabalık dize kafa eşitse Just (char,tail) döndürür veya Nothing aşağıdaki işlevi bulundu:Haskell - Garip davranışları engellemek yapmak

char :: Char -> String -> Maybe (Char, String) 
char c s = do 
    let (c':s') = s 
    if c == c' then Just (c, s') else Nothing 

ve onlar desen başarısız, ama ne zaman Nothing için değerlendirirsiniz bir do blokta ise neden let (c':s') = s, bir istisna oluşturmaz edeceğini açıklamak, yani durum böyle değil ben denedim çünkü:

*Main> char 'a' "" 
*** Exception: exercice2.hs:5:7-17: Irrefutable pattern failed for pattern (c' : s') 
Yani bunu yeniden yazmak zorunda:

char' :: Char -> String -> Maybe (Char, String) 
char' _ [] = Nothing 
char' c (c':s') 
    | c == c' = Just (c,s') 
    | otherwise = Nothing 

ve beklendiği gibi ... Neden oluyor bana çalıştı?

+0

konu Kapalı: [1] nitpicking: Haskell Wiki/= Haskell Vikikitap (ortak bir karışıklık olduğu). [2] Kitapta gerçekten bir hata varsa MonadPlus bölümü kısa bir süre içinde AMP için güncelleneceğinden, bunu bildirmek için çok uygun bir an vardı. Teşekkürler! – duplode

+1

@duplode Tamam, ben sizinki gibi Haskell Wikibook'a değiştireceğim – FtheBuilder

+0

@duplode Cehaletimden dolayı üzgünüm, ama AMP ne anlama geliyor? – FtheBuilder

cevap

7

Bence wiki yanlış. Muhtemelen 'un'u işlevini Monad işleviyle bağlayabilmesi gerçeğiyle karıştırmaktadırlar. Bu nedenle aşağıdaki örnekte Nothing döner Maybe gelen fail fonksiyonunu kullanır:

char :: Char -> String -> Maybe (Char, String) 
char c s = do 
    (c':s') <- return s 
    if c == c' then Just (c, s') else Nothing 
+1

Yup, gerçekten yanlış. Muhtemelen egzersiz yazarı '<' yerine yanlış yazdı ve aradan geçen sekiz yılda herkesin parmaklarının arasından geçti (kendimi dahil ettim!). – duplode