Drkcore

19 07 2012 Haskell Tweet

MaybeのmplusはPerlのor(||)みたいなもんか

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"

About

  • もう5年目(wishlistありマス♡)
  • 最近はPythonとDeepLearning
  • 日本酒自粛中
  • ドラムンベースからミニマルまで
  • ポケモンGOゆるめ

Tag

Python Deep Learning javascript chemoinformatics Emacs sake and more...

Ad

© kzfm 2003-2021