2010-12-25
スクウェア版
140 名前が無い@ただの名無しのようだ :2010/01/01(金) 12:55:54 ID:94PnCK1j0 20xx年 どういうわけかスクウェア版のHaskellが開発される事になった A「……かりそめの停止性に酔いしれる『エヴァリューション・オヴ・レイジィマシーン』は『型に嵌りしモナドも』により 副作用の危機に瀕していた。しかし、むしろこれを処理の最適化と歓迎するものもいた」
2010-09-15
UTF8のファイルの読み込み
import qualified System.IO.UTF8 as U8 main = do cs <- U8.readFile "test.txt" mapM_ U8.putStrLn (lines cs)
UTF8での標準出力
System.IO.UTF8を使う必要がある。
$ cabal install utf8-string
して、
import qualified System.IO.UTF8 as U8 main = U8.putStrLn "こんにちは、世界"
WindowsへのHaskell Platformのインストール
また遠ざかってすべて忘れたので、環境整備から。
Haskell Platformのインストーラをダウンロードして実行するだけ。Cabalもついてる。GHCのバージョンは6.12.3。
mr_konn2010/09/15 13:56GHC-6.12.3なら、String の入出力であれば、System.IO.UTF8を使わなくても標準のままで出来る筈です
mokehehe2010/09/17 07:10あら、そうなんですか。Cygwinから動かしていたからでしょうか。
2009-11-24
bloxorz
bloxors: an OpenGL Logic Game written in Haskell - YouTube
WindowsではOpenGLが入ってないのでコンパイルはできてない。ソースを見る限り、管理している状態はゲームとブロックしかなくて、updateでキー入力を見て状態を更新、renderで描画、というふうにまっとうに処理してるように見える。
2009-11-20
Haskellナイト
Haskellナイトに行ってきた。Tシャツ目当てで「Real World Haskell」と、300円安いというので「プログラミングHaskell」を買ってみた。
第一部には「入門Haskell」を書かれた向井さんも出ていた。Haskellに飽きたってのと、別にHaskellで書いても他のCとかで書いても同じってのと、難しい問題はHaskellで書いても難しいってことを言っていた。悲しいけど、なんとなく言いたいことはわかる。
モナドの話とか。山本さんが「モナドは型クラスの一種」のような説明をされて、わかったような気になったりならなかったり。
Typeclassopediaは良いという話なので読んでみよう。
第二部のHaskellゴング、私的にはtanakhさんのOpenGLを使ったプレゼンツールというのが特に気になった。DOMに丸投げしてるJavaScriptでプレゼンツール作るのとは全然労力違うんじゃ…と思ったけど、パワポみたいに現代風のページ遷移のエフェクトの付いたプレゼンツールになっていてすげーと思った。
あとkeqhさんのforkIOを使ってGHCiからSDLの窓と通信するのとか、酒井さんの自然言語をラムダ式で解釈する体系PTQのHaskell実装とかmaoeさんのParsec3でパース中にIOで別ファイルを読み込んで処理できるとか面白かった。
今度4月にSimon Peyton-Jones氏が来日されるということなので、そのときにまたこういう会があったらなんか発表できるように仕込んでおこう。
2009-11-09
マンデルブロ集合
なんの凝ったものもなく、Haskellでマンデルブロ集合を書いてみる。結果は標準出力にppm3で吐き出す:
import Complex import System.Environment main = do args <- getArgs let centerx = read $ getOption args 0 "0.0" let centery = read $ getOption args 1 "0.0" let scale = read $ getOption args 2 "2.0" let depth = read $ getOption args 3 "32" let w = read $ getOption args 4 "512" let h = read $ getOption args 5 "512" let dx = scale + (scale / (toEnum w)) let dy = scale * (toEnum h) / (toEnum w) + (scale / (toEnum w)) let img = mandelbrot w h (centerx - dx) (centery - dy) (centerx + dx) (centery + dy) depth saveppm w h img mandelbrot w h minx miny maxx maxy depth = [calcPixelColor x y w h minx miny maxx maxy depth | y <- [0 .. h-1], x <- [0 .. w-1]] calcPixelColor x y w h minx miny maxx maxy depth = if n == depth then (0,0,0) else hsv (n * 67) where n = calcDepth depth (px :+ py) px = ((toEnum x + 0.5) / toEnum w) * (maxx - minx) + minx py = ((toEnum y + 0.5) / toEnum h) * (maxy - miny) + miny calcDepth max c = length $ takeWhile (not . diverge) $ take max $ iterate (\z -> z * z + c) czero hsv h = case (h `div` 255 `mod` 6) of 0 -> (255, t, 0) 1 -> (255 - t, 255, 0) 2 -> (0, 255, t) 3 -> (0, 255 - t, 255) 4 -> (t, 0, 255) 5 -> (255, 0, 255 - t) where t = h `mod` 255 squareMagnitude c = (realPart c ** 2) + (imagPart c ** 2) --squareMagnitude c = (realPart c ** 2) * (imagPart c ** 2) diverge c = squareMagnitude c >= 4 getOption args idx defaultValue = if (length args) <= idx then defaultValue else args !! idx saveppm w h img = do putStrLn "P3" putStrLn $ show w ++ " " ++ show h putStrLn "255" mapM_ (\(r,g,b) -> putStr $ (show r) ++ " " ++ (show g) ++ " " ++ (show b) ++ " ") img czero = 0.0 :+ 0.0
複素数の長さの計算を間違って、
squareMagnitude c = (realPart c ** 2) * (imagPart c ** 2) -- '+' と '*' を間違えた
としたら変わった絵ができた:
概観は変わらないけどトゲトゲしたものになった。どういうこっちゃ!?面白い!


