[Concurrent Haskell] 無限リストが止まらない
- 2009-11-03
- カテゴリ: Client Side
- タグ: Tips Haskell 並行計算 アルゴリズム
HaskellのControl.Concurrent.Chanを使って、簡単な並行処理プログラムを作ろうとして試行錯誤したのでメモ。
Control.Concurrent.ChanはHaskellで並行処理をするときに使うことができるFIFOキューライブラリ。複数のスレッドからキューにデータを流し込んで、別のスレッドがそのデータを読み取って処理をしたりすることができる。
Control.Concurrent.Chanを使えば、スレッド間の排他処理とかを全く考えずに済むので、簡単に並行処理プログラムを書けるかと思っていたけど、処理終了時の扱いに悩んだので、ちょこちょこと試行錯誤してみた。
詳細は続きで。
[Haskell] 配列のインデント
- 2009-08-27
- カテゴリ: Client Side
- タグ: 安易な発想 Haskell Twitterでやれ
今までHaskellで配列をインデントするための気に入った方法がなかったけど、2つほど見つけた。
table = [[Infix (char '*' >> return (*)) AssocLeft,
Infix (char '/' >> return div) AssocLeft],
[Infix (char '+' >> return (+)) AssocLeft,
Infix (char '-' >> return (-)) AssocLeft]]
table = [ [ Infix (char '*' >> return (*)) AssocLeft,
Infix (char '/' >> return div) AssocLeft ],
[ Infix (char '+' >> return (+)) AssocLeft,
Infix (char '-' >> return (-)) AssocLeft ] ]
だから何かっていうわけではないけど、ちょっとうれしかったからメモ。
Haskellのコーディングスタンダードみたいなものってないのかなー
[Haskell] 素数列を生成するアルゴリズム×3
- 2008-09-10
- カテゴリ: その他のプログラミング
- タグ: Haskell アルゴリズム
最近すっかりブログから離れていたので、リハビリがてらにメモ代わりのエントリー。
Haskellで素数の無限リストを生成する関数を3つほど作ったのでメモ。
primes1 = 2:f [3,5..] where f (x:xs) = x:f [y | y <- xs, mod y x /= 0]
primes2 = 2:filter f [3,5..]
where f n = all ((/= 0) . (mod n)) (takeWhile ((<= n) . (^ 2)) primes)
primes3 = 2:f [3] [3,5..]
where f (x:xs) ys = let (ps, qs) = span (< x^2) ys
in ps ++ f (xs ++ ps) [z | z <- qs, mod z x /= 0]
primes2に関しては1000000個の素数 - HaHaHa! - haskellを、primes3に関しては誇大宣伝ではないエラトステネスの篩 - HaHaHa! - haskellをそれぞれ参考にした。
以下解説。
HaskellでProject Eulerに挑戦してみた
- 2008-08-24
- カテゴリ: その他のプログラミング
- タグ: アルゴリズム Haskell
id:gomi-boxに触発されて、Project Eulerに挑戦してみた。
Project Eulerみたいな、アルゴリズム的なものを書いて一人でくねくねする遊びは、Haskellとの相性が良すぎる。
コードは続きで。
[Haskell] Monad周りで自分なりに考えてみたこと
- 2008-08-07
- カテゴリ: その他のプログラミング
- タグ: 安易な発想 Haskell
Haskellを真面目に勉強し始めて10日ほど経つ。一応、Yet Another Haskell Tutorialをだいたい読み終わったわけだが、最後のモナドの章だけは断念した。日本語で何回説明されてもわからないものを英語で説明されてもわかるわけがない。
とはいえ、一応Haskellの文法などは勉強してみて、モナドについてもいろいろと聞きかじってみたわけで、自分なりに「モナドってこんなものなのかな?」っていうようなものはつかめたような気がする。なので、自分なりの理解やら疑問やらをメモっておこうかと思う。
自分の考えの整理のために書き連ねるので、もし間違っていたり考え違いをしているところがあれば (そんなところばっかだろうけど) 、容赦なく突っ込んでもらいたい。
Haskellっぽいfizzbuzz書けた!
- 2008-07-28
- カテゴリ: その他のプログラミング
- タグ: Haskell 入門 関数志向
昨晩、突然ひらめいてHaskellでfizzbuzzを書いてみた。
fizzbuzz :: Integer -> Integer -> [String]
fizzbuzz x y | x > y = []
| (mod x 15) == 0 = "FizzBuzz" : fizzbuzz (x + 1) y
| (mod x 3) == 0 = "Fizz" : fizzbuzz (x + 1) y
| (mod x 5) == 0 = "Buzz" : fizzbuzz (x + 1) y
| otherwise = (show x) : fizzbuzz (x + 1) y
なんかすごくHaskellっぽいコードを書けたような気がするんだけどどうだろう?少なくとも、依然書いた↓のfizzbuzzよりは手続き色が抜けてるんじゃないかな?
[Java] こういうときどうすればいいの?
- 2008-03-25
- カテゴリ: その他のプログラミング
- タグ: 安易な発想 Java Haskell
例えば、数値を分数のまま四則演算する有理数クラスが↓のようになっていたとします。
public class Rational {
private int numerator = 0;
private int denominator = 1;
public Rational(int numerator, int denominator) { ... }
public Rational add(Rational x) { ... }
public Rational subtract(Rational x) { ... }
public Rational multiply(Rational x) { ... }
public Rational divide(Rational x) { ... }
}
当然、このクラスを使う側では↓のようなコードを書くわけですね。
Rational add(Rational x, Rational y) {
return x.add(y);
}

