pleacの7.3を解いた
その後環境変数HOMEとLOGDIRを||で繋ぎたいなぁと思ったけど>>=は失敗を運ぶから使えないよなぁと思っていたらmplusがあったかと。
import Data.List.Split import Control.Applicative import Control.Monad import Text.Regex import System.Environment getpwnam username = do passwds <- map (splitOn ":") <$> lines <$> readFile "/etc/passwd" return (filter (\line -> (line!!0)==username) passwds) main :: IO () main = do (path:_) <- getArgs case matchRegexAll (mkRegex "^~([^/]*)") path of Nothing -> putStrLn path Just (_,uhome,subdir,cs) -> if length cs == 1 && length (cs!!0) /= 0 then do dir <- getpwnam (cs!!0) if (length dir) == 1 then putStrLn $ ((dir!!0)!!5) ++ subdir else putStrLn $ "Error: " ++ uhome ++ " not found" else do homedir <- lookup "HOME" <$> getEnvironment logdir <- lookup "LOGDIR" <$> getEnvironment case homedir `mplus` logdir of Just home -> putStrLn $ home ++ subdir Nothing -> putStrLn "Error: Env[HOME] not found"
これでHOMEが見つかればその後のLOGDIRは無視するし、見つからなければ評価される。
さらにliftM2で書きなおした
else do result <- liftM2 mplus (lookup "HOME" <$> getEnvironment) (lookup "LOGDIR" <$> getEnvironment) case result of Just home -> putStrLn $ home ++ subdir Nothing -> putStrLn "Error: Env[HOME] not found"