hayaのHaskell日記

2006-08-25

[] 7.9節 練習問題 fold 21:38

まずは自力で

num = 60

main = do cs <- getContents
          putStr $ fold cs

fold :: String -> String
fold cs
  | length cs <= num = cs
  | otherwise      = unlines $ concatMap wrapLine $ lines cs
    where
      wrapLine :: String -> [String]
      wrapLine line = makeLines $ splitAt num line
      
      makeLines :: (String, String) -> [String]
      makeLines (fstString, sndString)
        | length sndString > num = fstString : (makeLines $ splitAt num sndString)
        | otherwise     = fstString : sndString : []

wrapLine が激しく無駄な気がする。が消し方がわからん。

解答を写経

foldWith = 60

main = do cs <- getContents
          putStr $ fold cs

fold cs = unlines $ concatMap foldLine $ lines cs

foldLine line = case splitAt foldWith line of
                  (s, [])   -> [s]
                  (s, cont) -> s : foldLine cont

なるほどー、そこでcaseか。ガードと引数でのパターンマッチだと、splitAtの適応のために無駄関数が一つ増えてしまうからなぁ。まだまだHaskellの感覚がつかめていない、ということだね。

[] 8.1節 値としての関数 00:03

特筆することもなく。あ、無名関数便利。

[] 8.2節 関数合成 00:03

直感的で、数学っぽい。

[] 8.3節 部分適用 00:03

なるほど!あのときの疑問が解決した!部分適用スバラシス

Haskellは本質的にはパラメタが1つの関数しか存在しないんだね。すばらしい。

[] 8.4節 ポイントフリースタイル 00:03

やりすぎるとワケワカメになる予感。でも、変数が消えるというのはなかなか面白い。大抵のプログラミング言語重要な要素である変数が、Haskellでは忌み嫌われている。言語の構成要素が少ないほうが、バグの原因が少ないから、その点でHaskellプログラマバグから解放してくれる可能性があるのかもしれない。でも、考え方になれないとなかなかきつい(´・ω・`)

[] 8.6節 練習問題 00:26

まずは自力で

lstrip :: String -> String
lstrip = dropWhile matchSpace

matchSpace :: Char -> Bool
matchSpace c = any (== c) [' ', '\t']

rstrip :: String -> String
rstrip = reverse . lstrip . reverse

strip :: String -> String
strip = lstrip . rstrip
main = do cs <- getContents
          putStrLn $ lastNLines 10 cs

lastNLines n = unlines . takeLast n . lines
takeLast n = reverse . take n . reverse

解答を写経

import Char

lstrip :: String -> String
lstrip = dropWhile isSpace

rstrip :: String -> String
rstrip = reverse . lstrip . reverse

strip :: String -> String
strip = rstrip . lstrip
main = do cs <- getContents
          putStr $ lastNLines 10 cs

lastNLines n = unlines . takeLast n . lines
takeLast n = reverse . take n . reverse

isSpaceを自作しちゃった以外は上出来じゃない?matchSpaceは、簡単にスペース文字を追加できるようになってるから、あとからスペース文字を増やすこともできるし、セクション勉強にもなったし、結果オーライってことで。

MohammadMohammad2012/05/02 18:21I ltieallry jumped out of my chair and danced after reading this!

pavgsqfjpavgsqfj2012/05/03 11:28xqgVIZ <a href="http://qjelzltbtkpo.com/">qjelzltbtkpo</a>

lyvvjyxlhlyvvjyxlh2012/05/03 15:13K6fhGU , [url=http://ubxrucmfpltn.com/]ubxrucmfpltn[/url], [link=http://gughlccdruix.com/]gughlccdruix[/link], http://erinivqtnqns.com/

zqefrczqefrc2012/05/04 15:45jVpRsW <a href="http://egcyxsybgnsz.com/">egcyxsybgnsz</a>

jcisbfksmcjcisbfksmc2012/05/05 16:04pcPkE8 , [url=http://wjbzmimoanyc.com/]wjbzmimoanyc[/url], [link=http://rcfbqnmfncrw.com/]rcfbqnmfncrw[/link], http://saucybmfgegy.com/

jcisbfksmcjcisbfksmc2012/05/05 16:05pcPkE8 , [url=http://wjbzmimoanyc.com/]wjbzmimoanyc[/url], [link=http://rcfbqnmfncrw.com/]rcfbqnmfncrw[/link], http://saucybmfgegy.com/

トラックバック - http://haskell.g.hatena.ne.jp/harg/20060825