読者です 読者をやめる 読者になる 読者になる

ふつうのHaskellプログラミング 練習問題

Programming Haskell

ページ数などは初版第4版基準。
正しい自信はない。プログラム類は一応動いた。
あと壮絶な斜め読みをしているので、題意に沿った解答ができているとは限らない。
Haskellとか分からんし…はやく慣れたいね。

2.8 練習問題(P. 53)

1. countbyte.hs
main = do cs <- getContents
          print $ length cs
2. countword.hs
main = do cs <- getContents
          print $ length $ words cs

3.6 練習問題(P. 82) swapa.hs

main = do cs <- getContents
	  putStr $ map swappa cs
	     where
	        swappa 'A' = 'a'
		swappa 'a' = 'A'
		swappa c = c

4.4 練習問題(P. 99)

1. sort.hs
import List
main = do cs <- getContents
	  putStr $ unlines $ sort $ lines cs
2. uniq.hs
import List
main = do cs <- getContents
	  putStr $ unlines $ remdup $ group $ sort $ lines cs
	     where
	        remdup :: [[a]] -> [a]
	        remdup [] = []
	        remdup (x:xs) = head x : remdup xs

6.9 練習問題(P. 157)

resolve f (x:xs) = (textify x) ++ (resolve f xs)

getenv key env = (fromMaybe "" (lookup key env))

readTemplete id = ((readFile (prefix repo)) ++ "/" ++ id)

7.9 練習問題(P. 191)

わからん。タプルをリストになおすとかどうやればいいの?
というか二重リスト作ってその二重リストにリストを要素として追加とかってどう書けば正しく動くの?

8.6 練習問題(P. 217)

1. 2. 3. strip.hs
lstrip = dropWhile isWhite
   where isWhite ' ' = True
	 isWhite '\t' = True
	 isWhite '\n' = True
	 isWhite _ = False

rstrip = reverse . lstrip . reverse

strip = rstrip . lstrip

main = do cs <- getContents
	  putStrLn $ strip cs

isWhiteがちょっとダメだと思いますこれ

4. tail.hs (point-free version)
main = getContents >>= (putStr . lastNLines 10)
   where lastNLines n = unlines . reverse . take n . reverse . lines

これはいい感じだ。よく分かってない>>=も使った。いかにもHaskellっぽい。

5. fgrep.hs (maybe point-free version)
import System
import List

main = do args <- getArgs
	  cs <- getContents
	  putStr $ fgrep (head args) cs
  where
    fgrep pattern = unlines . filter (match pattern) . lines
    match pattern = any (isPrefixOf pattern) . tails

あんまかっこよくない。というかモナドよく分かってないので、上のdo文を使わない形で書き換えろと言われたら無理だ。

それ以降

まだやってない