--/--/--

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

2008/09/30

Project Euler: Problem 2

Problem 2

3回に一度偶数が出現するという性質を利用。なにかのプラスになってるかどうかは不明。

実行結果

$ runhaskell 2.hs
4613732

プログラム

1 fibs = map fst $ iterate (\(n,m) -> (m,n+m)) (1,1)
2 skip n xs = skip' 0 xs
3     where skip' _ [] = []
4           skip' a (x:xs) | a == n    = x : skip' 0 xs
5                          | otherwise = skip' (a+1) xs
6 evenFibs = skip 2 fibs
7
8 = sum $ takeWhile (< 4000000$ evenFibs
9 main = print $ f

2008/09/30

Project Euler: Problem 1

Problem1

特に何も考えず、数列を作って合計をとる。

実行結果

$ runhaskell 1.hs
233168

プログラム

1 = sum $ filter (\-> n `mod` 3 == 0 ||
2                         n `mod` 5 == 0)
3                  [1..999]
4
5 main = print $ f

2008/09/30

Project Euler

1からやってみるとする。問題は和訳wikiから。

2008/09/27

Google Reader の挙動

最近微妙に変わっている。一昨日は n で一覧も一緒にスクロールしていたのだけど、今はそれがない。今は j で一覧も一緒にスクロールするが、一昨日まではそれはなかった。なんか実験中?

2008/09/25

State モナドがわからない

なんというか、途中でついていけなくなる。以下のような State モナドっぽいものがあるとする。

type State = Integer --適当
newtype StateM a = SM (State -> (a, State))

instance Monad StateM where
    SM calc1 >>= f = SM (\s0 -> let (r, s1) = calc1 s0
                                    SM calc2 = f r in calc2 s1
    return v = SM (\s -> (v, s))

これの2行目までは頭がついていくんだけど、StateM を用いた計算の定義になると、ついていかなくなる。と思って上のソースを書いていたら、なんとなく分かってきた気がする。

  1. 1つ目の State を用いた関数 calc1 を、状態 s0 を以って評価する。
  2. その計算結果(r)から、次の StateM を生成(?)する (f r)。
  3. 生成した次の StateM の値となっている、calc1 の次に State を用いた計算を行なう関数 calc2 を、calc1 の評価後の状態 s1 を以って評価する。

という内容の関数を、(>>=) で構築しているのだね。

2008/09/24

複数のアクションの結果を要する関数に >>= する

複数のアクションの結果を要する関数に値を渡すときには do 記法を使っていた。というのも、どうすれば >>= を使って表現できるか分からなかったから。

そして今、ようやく1つの書き方が分かった。

do a <- getChar
   b <- getChar
   print $ maxChar a b

これを以下のようにする。

getChar >>= \a -> getChar >>= print . maxChar a

まぁどれほど嬉しいかと言えば大して嬉しくはないのだけれど。書けるか書けないか、書くか書かないかの差は、気分的にでかい。

2008/09/23

祝日

なんか久しぶりに、何も予定のない休日だ。何しようかな。どうせ大したことはしないんだけど。

2008/09/20

念願の

坊主にした。2ヶ月くらい前からしたいと思っていたのだけど、諸事情により今日まで延びた。いやはや楽である。

2008/09/19

JSTM

JSTM は Java の STM ライブラリ。分散共有メモリの管理も STM で行うことを想定していて、STM だけに留まらないライブラリ。

で、こいつの実装がブロッキングしまくりでイマイチだなぁと思ってたのだけど、インタフェースが使いやすいことから、勉強会ではこれを用いたサンプルを紹介することにした。何より Java なので、言語レベルでの弊害がないのが一番の利点。

Haskell 使うと Haskell の解説だけにすごく時間取られそうだし、そもそも上手く説明する自信もない。

というわけで、簡単な例は JSTM でサンプル作って説明文書き終わった。これからどうしようと悩んでいるところ。実践的な応用例を出したいところなのだけど、ちょうどいいネタが思いつかない。

実践的な応用例を探すか、サンタクロース問題とか哲学者の食事問題辺りでお茶を濁すか、実装について軽く触れるかのどれかかなぁ。

2008/09/18

勉強会の準備

Software Transactional Memory を題材にした勉強会を土曜に予定している。が、いまいち資料作成が進まない。

STM といっても実装寄りの話だったり、使い方の話だったり色々あるわけだけど、今回は使い方の話をするつもりでいる。が、STM をまともに使える言語ってHaskell ぐらいしかない。Java や C# のライブラリもあるのだけど、やはり言語の特性上、Haskell のそれと比べると見劣りしてしまう。

Haskell のことなんて全くしらない人達に、Haskell で STM 使ってプログラム書くところを紹介したところで、何かメリットってあるのかなぁなんて思ったり。

明日中には仕上げて、金曜はゆっくり過ごしてやるためにも、そんな感じでうだうだと作業中。

2008/09/15

ネット開通

ちょうど1ヶ月半振り。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。