noritsuguの日記

2006-07-13『入門 Haskell』 第2章

  • (p.40) そういえば、ML 関係の文章を読んでいると、整数と浮動小数点の演算は混ぜられないと書いているけど、Haskell はそこらへんどうなっているんだろう?
  • ということで試す。「1+1」も「1+1.0」も OK みたい。
  • (p.43) Unit 型。既に存在を忘れていた。またすぐに忘れると思う…
  • (p.45) otherwise は、ただの True の別名。がぴょーん。「Prelude> :t otherwise」で、「otherwise :: Bool」となった
  • そういえば、ふつけるは、「:t」を使っていないんだよなあ。一つもなかったかは分からないけど、あれは意図的に使わない作戦と見た。もしかしたら、「:q」以外は説明していないかも???(索引にないから調べにくい)
  • (p.50) 「このように部分適用できる仕組みをカリー化といいます。」とある。一方、ふつけるでは、「部分適用に関係するカリー化という概念があるのですが、」(p.348)とある。
  • (p.54) 「セクション」 見逃していたな。EmacsLisp には、1+ があるけど、そういうものかと勘違いしていたが、もっと汎用性があるものだった。1+ は Scheme にはないようだ。

練習問題(p.50)

単に引数をなくせば良いのだろうか?

関数合成、部分適用、ポイントフリースタイル、カリー化がごちゃごちゃになっているのだが、、、

import Char
import System.Environment

bytesCount []     = 0
bytesCount (c:cs) = 1 + bytesCount cs

linesCount []        = 0
linesCount ('\n':cs) = 1 + linesCount cs
linesCount (c:cs)    = linesCount cs

wordsCount :: String -> Int
wordsCount = outWords
    where wordScan f [] = 0
          wordScan f (c:cs)
              | isAlphaNum c = f (inWords cs)
              | otherwise    = outWords cs
          outWords :: String -> Int
          outWords = wordScan (\n -> 1 + n)
          inWords :: String -> Int
          inWords = wordScan id

wcFile fileName =
    do contents <- readFile fileName
       putStrLn ("\t" ++ show (linesCount contents)
                 ++ "\t" ++ show (wordsCount contents)
                 ++ "\t" ++ show (bytesCount contents)
                 ++ "\t" ++ fileName)

main = do args <- getArgs
	  mapM_ wcFile args
トラックバック - http://haskell.g.hatena.ne.jp/noritsugu/20060713