19072012 Haskell
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"
零細企業のホームページが繁盛店に化けた理由(ワケ)
お客様から選ばれるウェブ文章術
ラーメン屋バカ一代 哀愁の経営失敗物語55
The Haskell School of Expression: Learning Functional Programming through Multimedia
コンピュータプログラミングの概念・技法・モデル(IT Architect' Archiveクラシックモダン・コンピューティング6) (IT Architects’Archive CLASSIC MODER)
すごいHaskellたのしく学ぼう!
圏論の基礎
素数夜曲: 女王陛下のLISP





