Hatena::Grouphaskell

mokeheheの日記

2010-12-26

トラックバック - http://haskell.g.hatena.ne.jp/mokehehe/20101226

2010-12-25

スクウェア版

via スクウェア版の○○が開発されるスレ

140 名前が無い@ただの名無しのようだ :2010/01/01(金) 12:55:54 ID:94PnCK1j0
20xx年 どういうわけかスクウェア版のHaskellが開発される事になった

A「……かりそめの停止性に酔いしれる『エヴァリューション・オヴ・レイジィマシーン』は『型に嵌りしモナドも』により
  副作用の危機に瀕していた。しかし、むしろこれを処理の最適化と歓迎するものもいた」
トラックバック - http://haskell.g.hatena.ne.jp/mokehehe/20101225

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_konnmr_konn2010/09/15 13:56GHC-6.12.3なら、String の入出力であれば、System.IO.UTF8を使わなくても標準のままで出来る筈です

mokehehemokehehe2010/09/17 07:10あら、そうなんですか。Cygwinから動かしていたからでしょうか。

トラックバック - http://haskell.g.hatena.ne.jp/mokehehe/20100915

2009-11-25

ライフゲーム

リハビリがてら、Haskellでなんか書きたくなってきた。ライフゲームを、できればgolf的に短く書きたい:

import Data.List (transpose, tails)

-- rule for Conway's Game of Life
conway 0 3 = 1
conway 1 2 = 1
conway 1 3 = 1
conway _ _ = 0

step rule edge m = opmtx rule m $ neighbor edge m
neighbor edge m = opmtx (-) (sum3x3 $ edge m) m
sum3x3 = verthorz $ foldl1 (opmtx (+)) . take 3 . tails
opmtx = zipWith.zipWith
verthorz f = transpose.f.transpose.f

-- boundary condition
wrap = verthorz (\m -> [last m] ++ m ++ [head m])
clamp = verthorz $ map (\s -> [0] ++ s ++ [0])


-- how to execute: runhaskell LifeGame.hs < test.txt
{- test.txt:
.....
..*..
...*.
.***.
.....
-}

main = getBoard >>= runGame 100 conway wrap

getBoard = getContents >>= return . map (map c2i) . lines
runGame n rule edge = mapM_ (\m -> dispBoard m >> putStrLn "====") . take n . iterate (step rule edge)
dispBoard = mapM_ putStrLn . map (map i2c)

c2i '*' = 1
c2i _   = 0

i2c 0 = '.'
i2c 1 = '*'

point freeスタイルには徹底できないなー。できればグラフィカルにしてUIとかもつけてみたいね。

トラックバック - http://haskell.g.hatena.ne.jp/mokehehe/20091125

2009-11-24

bloxorz

via Haskellでできたゲーム - 落書き、時々落学

bloxors: an OpenGL Logic Game written in Haskell - YouTube

WindowsではOpenGLが入ってないのでコンパイルはできてない。ソースを見る限り、管理している状態はゲームとブロックしかなくて、updateでキー入力を見て状態を更新、renderで描画、というふうにまっとうに処理してるように見える。

トラックバック - http://haskell.g.hatena.ne.jp/mokehehe/20091124

2009-11-20

Haskellナイト

f:id:mokehehe:20091121071539j:image:right

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氏が来日されるということなので、そのときにまたこういう会があったらなんか発表できるように仕込んでおこう。

トラックバック - http://haskell.g.hatena.ne.jp/mokehehe/20091120

2009-11-09

マンデルブロ集合

f:id:mokehehe:20091109152525p:image

なんの凝ったものもなく、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)  -- '+' と '*' を間違えた

としたら変わった絵ができた:

f:id:mokehehe:20091109152522p:image

概観は変わらないけどトゲトゲしたものになった。どういうこっちゃ!?面白い!

AmyAmy2012/05/03 05:47I was drawn by the hoensty of what you write

kdzqrlgkkkdzqrlgkk2012/05/03 11:05uxnTuQ <a href="http://gesodopjyccm.com/">gesodopjyccm</a>

komruhtkomruht2012/05/04 08:525HA6dP , [url=http://dbbqtmrtdzwy.com/]dbbqtmrtdzwy[/url], [link=http://ofgdslmvsbet.com/]ofgdslmvsbet[/link], http://fqijivjgecua.com/

xpwtacxpwtac2012/05/05 12:21OuNqtQ <a href="http://ypyfmgtmqczx.com/">ypyfmgtmqczx</a>

svyhvcnoqejsvyhvcnoqej2012/05/05 15:23Hpt0GN , [url=http://zuawlmlpogxd.com/]zuawlmlpogxd[/url], [link=http://ertwpdvhqyay.com/]ertwpdvhqyay[/link], http://xpkrwlhksssw.com/

トラックバック - http://haskell.g.hatena.ne.jp/mokehehe/20091109