2012年6月23日

Haskell難しい

すごいHaskellたのしく学ぼう!
ですが第11章難しい
なに言ってるんだかさっぱりわからん
嫌になってきた

2012年6月18日

Haskellでcode jamに挑戦

2012年の予選問題
Problem C. Recycled Numbers

出題範囲の数を全部列挙して、それぞれrecycled numberを作り出して出題範囲に収まっているかどうか調べてからrecycled numberだけを畳み込んで数える

import Data.List

toInteger' s = read s :: Integer

rotate lower upper n = let f1 n = n `div` 10
      f2 n = (n `mod` 10) * 10 ^ (digitcount - 1)
      f3 n = f1 n + f2 n
      digitcount = length $ show n
      rec _ 0 r = length (filter (\x -> x >= lower && x <= upper) $ Data.List.nub r) - 1
      rec n d r = rec (f3 n) (d - 1) ((f3 n) : r)
      in rec n (digitcount - 1) (n:[])

scan lower upper = (foldl' (\acc x -> acc + (rotate lower upper x)) 0 [lower..upper]) `div` 2

compute s = let f = map (toInteger') (words s)
  in scan (head f) (last f)

main = do
 line <- getLine
 contents <- getContents
 putStrLn $ unlines $ map (\(i, line) -> "Case #" ++ show i ++ ": " ++ show (compute line)) $ zip [1..] $ lines contents

Haskellの注意点

Haskellは割り算を/(スラッシュ)でやってしまうとえらいことになってしまう
/(スラッシュ)じゃなくてdivが用意されているから気をつけないといけない

2012年6月5日

すごいHaskellたのしく学ぼう!読書感想

「すごいHaskellたのしく学ぼう!」を読みながらHaskell修行中
Haskellの楽しいところは非正格評価で必要になるまで評価されない点だと思う
整数配列が[1..]と書けるところが素晴らしい
あとは他の言語でもあるのだけどリスト内包表記だね
これがあると繰り返していちいちリスト作るのが面倒で仕方が無くなる
この本に載っている直角三角形を求める例も素晴らしい例だと思う
ワンライナーだけど全然読みづらくなくて逆に直感的で分かりやすい記述だと思う

Haskellは型推論がしっかりしてるから普通でいきなりジェネリックなところも素晴らしいですね
結局型宣言書くことになるのだけど実際のプログラム自体に余計な記述が入り込まないから簡潔になっていいですね
Common Lispは大好きでたいへん尊敬しているのですが動的型付はどうも性に合わないんですよね
静的型付のほうがしっくりくるので型推論は非常に嬉しいです

でもなんだかんだいっても結局Haskellの魅力は関数の構文の素晴らしさですね
パターンマッチ、ガード、where、let、caseとあって手続き型だと結局ifかswitch程度しかなくてなんとも貧弱なのですがHaskellはやっぱりこの辺りが洗練されているなと思います

次に続くのが超目玉のカリー化だったり部分適応だったりで
これらを駆使してmapやfoldを利用するために関数合成、$での関数適用でソースを読みやすくして
ポイントフリースタイルでさらに関数合成を洗練させられる
まあ当然ラムダも素晴らしいんですけどね

とりあえず5章まで読んだんですけどここまででもHaskellの素晴らしさ魅力はあふれんばかりだと思います
この本はモナドやIOがなかなか登場しないですね

まあなんにしても5章まででも十分すぎるほど読む価値あると思います

この本は関数型について学びたい人には向いてないかな
Haskellを使えるようになりたい人には向いていると思います
関数型についてだったらF#やOCamlの本の方がいいんじゃないかな

2012年6月2日

読書感想

「プログラミングClojure」を読んであらためてCommon Lispの素晴らしさがわかったような気がします
Clojureの本なんですけどこの本に書いてあることはCommon Lispで全てできる
Common Lispのパワーを改めて感じられました
やっぱりCommon Lispすげーや
Clojureって言っても、Common Lispのマクロ拡張セットじゃないかなと

LET OVER LAMBDA
この本は何回読んでも難しい
全然理解できない
意味わかんないと言うか頭がついていかない
実際コード入力してやってみても意味わかんないし
とにかく難しい
前回読んだときより多少理解できるようになってきてるのでまた一年後くらいに読むことになるのだけどその時はもう少しわかるようになっているかな

「すごいHaskellたのしく学ぼう!」
Haskellの本は4冊目くらいかな
一向にできるようにならないですね
関数のCase、ガード、whereが上手く使いこなせない気がします
このあたりは練習あるのみではないかなと

「ドメイン特化言語」
マーチン・ファウラー著の本が近所の普通の本屋で売ってたので思わず買ってしまった
なんでこんな本仕入れたのかまったく理解できないですね
今日買いました