• 追加された行はこの色です。
  • 削除された行はこの色です。
* cat by foldM [#o471dc62]
[[foldM:http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Monad.html#v%3AfoldM]]を使ってcat。引数に与えられたファイルを結合して標準出力に流し込みます。


 import Control.Monad(foldM)
 import System.Environment(getArgs)
 
 -- readFile :: FilePath -> IO String
 -- getArgs :: IO [String]
 -- foldM :: Monad m => (a -> b -> m a) -> a -> [b] -> m a
 -- see http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control-Monad.html#v%3AfoldM
 
 freadAppend :: String -> FilePath -> IO String
 freadAppend x f = do
   str <- readFile f
   return $ x++str
 
 main :: IO ()
 main = do
   files <- getArgs
   str <- foldM freadAppend "" files
   putStrLn str


*sumOfLen by foldM [#c27d28fa]
長さを表すリストをとって、その総和を返す関数を作ってみました。ただし長さなので、負の値があると全体が失敗します。

 sumOfLen = foldM add 0
     where
       add a b = if b < 0 then
                     Nothing
                 else
                     Just $ a + b

 *Main> sumOfLen [3,4,5]
 Just 12
 *Main> sumOfLen [3,-4,5]
 Nothing
 *Main>

こういう感じの使いかたであってるんでしょうか?

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS