エンジニアのソフトウェア的愛情

または私は如何にして心配するのを止めてプログラムを・愛する・ようになったか

Haskell

HaskellでOpenGL(再放送)

どう書く?orgに投稿したものにちょっと手を加えたものを、備忘録代わりにこちらにも投稿。 「event handlers」以下が、OpenGL/GLUTを使って時間経過とともに状況(表示)が変わるものを表示するプログラムを書くときのテンプレートになると思います。draw関数…

リストにおけるdo式

コメント欄で教えて頂きました(ありがとうございました)。コメント頂いた内容の繰り返しになりますが、理解した内容をなぞっておさらいしたいと思います。 まず、つまずいたのがこの部分。 k m m' = do { x <- m; xs <- m'; return (x:xs) } do式の理解が不…

「リストのリストにsequenceを適用すると直積が得られる」のはなぜか考える

教えてくれることを期待して思考停止しているようではダメダメなので、理解できるところまで考えてみる。基本に立ち返ると、sequenceのソースは次のようになっているのがここからわかる。 sequence ms = foldr k (return []) ms where k m m' = do { x <- m;…

リストのリストにsequenceを適用すると直積が得られる

どう書く?orgのお題より。リストのリストにsequenceを適用すると直積が得られる。 $ ghci Prelude> sequence [[1,2,3], [4,5,6]] [[1,4],[1,5],[1,6],[2,4],[2,5],[2,6],[3,4],[3,5],[3,6]] Prelude> sequence ["abc", "def"] ["ad","ae","af","bd","be","b…

統計的に正しいランキングを行う方法をC++とかHaskellとかで書く

http://d.hatena.ne.jp/makiyamakoji/20090512/p1のコードを参考に(というか、ほとんど一緒ですが)C++で書き直してみた。 #include <algorithm> #include <stdexcept> #include <cmath> double calcNormalDistPercentile(double percent) { if((percent <= 0) || (1 <= percent)) { throw </cmath></stdexcept></algorithm>…

四元数

四元数が扱えるわけでないのだけれど、書いてみた。 意外と簡単だったんだけど、本当にこれでいいのだろうか? module Quaternion where data (RealFloat a) => Qtn a = Qtn { x::a, y::a, z::a, w::a } deriving Eq instance (RealFloat a) => Show (Qtn a) …

narioがMac OS Xでサクッと動いた

わたしが以前「遅い」と書いたことに対して、id:TTSYさんが「http://d.hatena.ne.jp/TTSY/20081202/p2」で言及してくださいました。 で、言及されていたとおりthreadDelayをコメントアウトしたところ、あっ!サクッと動いた! id:TTSYさん、ありがとうございま…

Kleisli

import Control.Arrow import Data.List return "hogehoge.txt" >>= readFile >>= return.lines >>= return.sort >>= return.unlines >>= putStrLn runKleisli (Kleisli readFile >>> arr lines >>> arr sort >>> arr unlines >>> Kleisli putStrLn) "hogeho…

ArrowLoop

今日はArrowLoopに挑戦。激しく混乱中。たとえば、基本的な例の loop (\(x,y)->(y,x:y)) 1 がどう動くのかは理解できるんですが、まだ自分が期待する結果が得られる式をうまく書くことができません。こちらで紹介されている例をみて「むむ、Yコンビネータと…

図説Arrow

これでいいのかな?教えて、偉い人。 f >>> g first f second f f *** g f &&& g left f right f f +++ g f ||| g 図はditaaで作成しました。

Arrowの正体が、まだ見えない

ファンクション倶楽部のイベントに参加してArrowの話を聞いてから、Arrowに関する文章を読んでいるのだけれど、いまだにArrowの正体がつかめない。 使い方はid:takkan_mさんが書かれたエントリとかで学べたんですが、背景にある考え方がまだ理解できてないみ…

narioをMac OS Xで動かした

試行錯誤の結果を紹介。 準備 おとといのエントリを参考に、GHC、SDL、HSDL、narioを準備してください。 SDLMain.m/.hの編集 SDLのエントリになるSDLMain.mとSDLMain.hをSDLのsrc/main/macosx/からコピーします。 エントリポイントをHaskellのプログラムから…

続々・narioをMac OS Xで動かす

動いた! でもメチャクチャ遅い。1.33GHzのPowerPCではしょうがないのかな。 仕切り直して、FFIを使って“Haskellのmain→SDLMain.mのエントリポイント→narioのエントリポイント”という順番に呼び出すように変更してみました。こんな感じ。 foreign import ccal…

続・narioをMac OS Xで動かす

FFIを使って、下の2行を呼んでやると、一応表示されるところまで来ました。 [[NSAutoreleasePool alloc] init]; [NSApplication sharedApplication]; しかし…。 イベントのフックができない。 どうやら、メインループになる[NSApp run]を呼んでやらないとい…

narioをMac OS Xで動かす

id:mokeheheさんが作られたゲームをMac OS Xで動かそうとしてみた。Haskellで敵を踏み潰したりするゲームを作ってみた - imHoライブラリを何度もインストールし直して、3日ほどかかってようやくビルドできた。もしかしたら、不要な手順があるかもしれません…

再帰定義

Scalaで再帰的に定義する方法がわからん、という話。Haskellで a = 0:[x+1 | x <- a] と書けるのをScalaに持っていって def a:List[Int] = 0::((for(i <- a) yield { i+1}) toList) と書くと、定義はできるんだけど実行するとStackOverFlowErrorがでる。わか…

Scalaに手を出す

性懲りもなく、また新しい言語に手を出しています。オブラブ夏イベントでプログラミングErlangをいただきました。プログラミングErlang作者: Joe Armstrong,榊原一矢出版社/メーカー: オーム社発売日: 2008/02/23メディア: 単行本(ソフトカバー)購入: 8人 …

環境変数の値を得る

テンポラリファイルを作るのに、テンポラリフォルダの値を得る必要に迫られて。 忘れないうちにメモメモ。 import System.Environment get_env :: [String] -> String -> IO String get_env [] d = return d get_env (s:ss) d = catch ( getEnv s ) ( \ _ ->…

行頭に引用記号をつける

引用記号に限らずですが。 例は、lsコマンドで一覧したディレクトリの内容に引用記号(>)をつける例です。 ls | ghc -e 'getContents >>= mapM_ putStrLn.map ((++) "> ").lines' 未来の自分のために解説。 getContentsで標準入力から文字列を取得 linesで文…

素数

Haskellの実装の例でよく出てくる素数の計算。こんな感じの。 import System.Environment primes = sieve [2..] where sieve (a:as) = a:(sieve [x | x <- as, x `mod` a /= 0]) -- コマンドラインで計算する素数の数を指定。 -- 指定がないときは10個まで計…

どれかと一致する・補遺

Haskellで書いてみたり… data Month = Jan | Feb | Mar | Apr | May | Jun | Jul | Aug | Sep | Oct | Nov | Dec deriving Eq foo m = if elem m [Jan, Mar, May, Jul, Aug, Oct, Dec] then putStrLn "odd month" else putStrLn "even month" Pascalで書いて…

Prelude探訪

scanlを使ったフィボナッチ数列 fib = scanl (+) 1 (0:fib) allを使った最大値を求める関数 以前の例。 max_value ns = head [x | x <- ns, and $ map (\ n -> x >= n) ns] all関数を使って。 max_value ns = head [x | x <- ns, all (\ n -> x >= n) ns] 日…

わかりやすいコードPart2・その3

いよいよもってわかりやすいコードからかけ離れてしまった感があるものの。 当り判定追加。相変わらずスコアを表示できず。代わりにコンソールにだだ流し。 かなりに雑なのは、わたしのHaskellスキルの限界か。でも、これだけのことを200行余りで書けてしま…

わかりやすいコードPart2・その2

エイリアン登場。まだ当り判定がありません。 一度作ったものの書き直しだからというのもあるのですが、思いのほか作業が早い。言語の違いにもっと手こずると思っていただけに、少し予想外でした。「わかりやすいコード」を意識したことで、より抽象的なレベ…

わかりやすいコードPart2

もう、コードがわかりやすいかどうかはどうでもよくなっている節がありますが。 こんどはHaskellで挑戦。 まずは、ウィンドウ上をなにかが動くところまで。 ghc --make moreComprehensible.hs ってな感じでコンパイルしてください。以下、コード。

VDM

VDMというのを知る。ここにある例題を見ながら、「宣言的に定義する様子が関数型言語みたい」と思った、ので、書いてみました。 swap swapは普通に。 swap (x, y) = (y, x) max・その1 集合や列の代わりにリストを使って。 max_value (n:ns) = max_value' n …

printf

Haskellのライブラリリファレンスを見ていたらprintfを発見。早速試してみる。 import Text.Printf putProd :: PrintfType r => Integer -> Integer -> r putProd m n = printf "%d * %d = %d" m n (m*n) 使い方はいたって簡単なのだけれど、最後の型がよく…

無限入れ子の値をHaskellで表現すると…

先日の問題をHaskellで表現する。 mugen_ireko = map valueAt [1..] where valueAt 1 = sqrt 2 valueAt i = sqrt $ 2 * valueAt (i-1) そのまま表現すればいいのに、なんで悩んだんだろ? Prelude> mugen_ireko !! 1000 1.9999999999999998

Foreign

便利なんですが、なんとなくズルをしている気分になります。Haskellっぽくないと。 import Foreign.Marshal.Array import Foreign.Ptr import Foreign.Storable import Data.Word main = do a <- mallocArray 10 :: IO (Ptr Word32) peekElemOff a 0 >>= pri…

整数型変換

import Data.Word -- 32ビット符号なし整数型へ変換 toWord32 :: (Enum a) => a -> Word32 toWord32 = toEnum.fromEnum -- 16ビット符号なし(ry toWord16 :: (Enum a) => a -> Word16 toWord16 = toEnum.fromEnum -- 8ビット(ry toWord8 :: (Enum a) => a ->…