タグ: Haskell

コマンドを起動して一定時間後にタイムアウト終了させるコマンドを作りました

コマンドを起動して一定時間内に終了しなかった場合に強制的にkillするコマンドラインプログラムを作りました。

Linuxではulimitを使えば似たような機能が実現できるし、それがなくてもバックグラウンド起動した後に一定時間sleepしてkill $!すればいいだけなんだけど、Windowsだとあまり単純ではなさそうだったので。

Haskellで書いた単純なプログラムなので、GHCでビルドしてあげればWindowsやLinuxで使うことができます。

詳細は続きで。

続きを読む

スポンサーサイト

[Concurrent Haskell] 無限リストが止まらない

HaskellのControl.Concurrent.Chanを使って、簡単な並行処理プログラムを作ろうとして試行錯誤したのでメモ。

Control.Concurrent.ChanはHaskellで並行処理をするときに使うことができるFIFOキューライブラリ。複数のスレッドからキューにデータを流し込んで、別のスレッドがそのデータを読み取って処理をしたりすることができる。

Control.Concurrent.Chanを使えば、スレッド間の排他処理とかを全く考えずに済むので、簡単に並行処理プログラムを書けるかと思っていたけど、処理終了時の扱いに悩んだので、ちょこちょこと試行錯誤してみた。

詳細は続きで。

続きを読む

[Haskell] 配列のインデント

今まで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

最近すっかりブログから離れていたので、リハビリがてらにメモ代わりのエントリー。

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に挑戦してみた

id:gomi-boxに触発されて、Project Eulerに挑戦してみた。

Project Eulerみたいな、アルゴリズム的なものを書いて一人でくねくねする遊びは、Haskellとの相性が良すぎる。

コードは続きで。

続きを読む

[Haskell] Monad周りで自分なりに考えてみたこと

Haskellを真面目に勉強し始めて10日ほど経つ。一応、Yet Another Haskell Tutorialをだいたい読み終わったわけだが、最後のモナドの章だけは断念した。日本語で何回説明されてもわからないものを英語で説明されてもわかるわけがない。

とはいえ、一応Haskellの文法などは勉強してみて、モナドについてもいろいろと聞きかじってみたわけで、自分なりに「モナドってこんなものなのかな?」っていうようなものはつかめたような気がする。なので、自分なりの理解やら疑問やらをメモっておこうかと思う。

自分の考えの整理のために書き連ねるので、もし間違っていたり考え違いをしているところがあれば (そんなところばっかだろうけど) 、容赦なく突っ込んでもらいたい。

続きを読む

Haskellっぽいfizzbuzz書けた!

昨晩、突然ひらめいて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

codepadで実行

なんかすごくHaskellっぽいコードを書けたような気がするんだけどどうだろう?少なくとも、依然書いた↓のfizzbuzzよりは手続き色が抜けてるんじゃないかな?

続きを読む

[Java] こういうときどうすればいいの?

例えば、数値を分数のまま四則演算する有理数クラスが↓のようになっていたとします。

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);
}

続きを読む

Haskellに入門

関数型言語というものにあこがれて、Haskellを勉強してみようと思い立ちました。

とりあえず、Hugsという処理系を導入(ダウンロードしてインストールするだけ)して、いろいろ調べてみました。

でも、まったく意味がわからない…

続きを読む