2016-04-28 33 views
8

IO [Maybe String] filtresini, >>= kullanarak listenin Just değerlerini saklamak ve IO içeriğini korumak için filtreleyin. bağlama-operatör olmadanFiltre IO [Belki Dize] - [Dize]

-- returns Just, if the passed binary-name is not present on the system 
binDoesntExist :: String -> IO (Maybe String) 
binDoesntExist ... 

Benim şimdiki çözüm:

missingBin :: [String] -> IO [String] 
missingBin xs = do 
    ys <- mapM (\x -> binDoesntExist x) xs 
    return $ catMaybes ys 

Şu anda Haskell öğrenme ve standart kütüphanenin farklı işlevleri nasıl kullanılacağını anlamaya çalışma var. Benim çözümüm işe yarıyor, ama sanırım daha temiz bir yol var.

+5

Ve sadece eğlence için, aslında "binDoesn'tExist" ismini kesme işareti ile adlandırabilir ve yine de çalışacaktır. –

cevap

9

kısa çözüm bunun için >>= operatörü gerekmez

missingBin :: [String] -> IO [String] 
missingBin = fmap catMaybes . mapM binDoesntExist 

olurdu.

Not: Muhtemelen olacak

-- returns True if the passed binary is not present on the system 
binDoesntExist :: String -> IO Bool 
binDoesntExist = ... 

Bu imza uygulanmasını:, sana doğrusu yani farklı bir tür imzası, olabileceğini sen binDoesntExist üzerine yazdım yorumun itibaren (\x -> binDoesntExist x) = binDoesntExist

3

şüpheli mevcut uygulamanızdan daha basit; ve ayrıca senin missingBin olacak hem de biraz daha basit:

missingBin :: [String] -> IO [String] 
missingBin = filterM binDoesntExist 

Bu tartışma mevcut fonksiyonu daima tam olarak geçirilen String döndüren varsayar (herhangi String hiç dönerse); ama bu varsayım bana çok uzak görünmüyor.

+0

'missingBin''i' IO Bool'’e çevirmekle ilgili haklısınız. Haskell-yapıtlarını anlatan zor kısım, Haskell'in nasıl düşünüleceğini öğrenmektir. Bahşiş için teşekkürler. – Paradiesstaub