2016-04-28 54 views
8

如何過濾IO [Maybe String]以僅使用>>=保留列表的Just值並保留IO上下文。將IO [String]過濾爲IO [String]

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

我沒有綁定運營商當前的解決方案:

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

我目前正在學習Haskell,並試圖瞭解如何使用標準庫的不同功能。我的解決方案有效,但我想有一個更清晰的方法。

+5

只是爲了好玩,實際上你可以用撇號命名它'binDoesn'tExist',它仍然可以工作。 –

回答

9

短的解決辦法是

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

你不需要>>=運營商爲。

注:(\x -> binDoesntExist x) = binDoesntExist

3

從你寫上binDoesntExist的評論,我懷疑你可能寧願有不同類型的簽名,即:

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

此簽名的實施將可能是比現有的實施更簡單;和此外missingBin將是相當簡單一點還有:

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

這個討論假設現有的函數總是返回正是它通過String(如果返回任何String在所有);但這個假設對我來說似乎並不那麼遙遠。

+0

你把'missingBin'變成'IO Bool'是對的。理解Haskell之後的難題是學習如何思考Haskell。謝謝你的提示。 – Paradiesstaub

相關問題