import Data.List.Split
import Control.Applicative
getncheck_guesslist :: IO [Int]
getncheck_guesslist = map read . splitOneOf ",;" <$> getLine
每次碼沼澤下來foo >>= return . bar
,這你不通過脫糖的DO-塊(和糾正類型錯誤),您沒有使用monad的monadic特性,而只使用它的函數部分,也就是說,你不是在搞類型的部分,而是用a
的IO a
:
(<$>) :: (Functor f) => (a -> b) -> f a -> f b
(fmap
將是<$>
的非中綴名稱。兩者都與map
密切相關。)
上面的代碼是特殊的代碼非常地道,但乾淨的代碼看起來像
import Data.Maybe
maybeRead :: Read a => String -> Maybe a
maybeRead = fmap fst . listToMaybe . reads
-- That fmap is using "instance Functor Maybe"
parseGuessList :: String -> [Int]
parseGuessList = catMaybes . map maybeRead . splitOneOf ",;"
getncheck_guesslist = parseGuessList <$> getLine
,或者,如果你不想忽略非INT輸入,但錯誤出,
parseGuessList xs = if success then Just . catMaybes $ ys else Nothing
where ys :: String -> [Mabye Int]
ys = map maybeRead . splitOneOf ",;" $ xs
success = all isJust ys
(請注意,雖然,我只是證明代碼是正確的,沒有真正嘗試過。)
如果它得到任何比這更復雜的,你會想用適當的解析天秤座ry,我想。
如果IO是一個謎題,您有兩個選擇:要麼通過學習來揭示它,要麼沒有它,並且沒有IO地編寫函數。我會建議與第二個選項一段時間。 – 2011-02-23 12:19:37