Hatena::Grouphaskell

mokeheheの日記

2009-11-03

haskgame

Haskellゲームライブラリ、SDLをラップしてとのこと

http://hackage.haskell.org/package/haskgame

どんなもんだろう?説明がないからよくわからないけど、定義を見る限り特に何もなさそうな。

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

2009-11-01

Haskell関連イベント目白押し、盛り上がってまいりました!

Haskellナイト、ゴングに出てみたいからなんか発表できるネタないかと考えてたんだけど、全然思いつかないのでしかたがないから観戦でいいかと思って申し込んでみると、整理番号20番とか…大丈夫か?

nobsunのつぶやきを見てたら、eyasuyuki氏のRTで

ENDO Yasuyukiさんのツイート: "Haskellゴング応募ないなあ。 http://bit.ly/2xYzht"

ENDO Yasuyukiさんのツイート: "Haskellゴング応募ない。Haskellerの勇者求む。 http://bit.ly/2xYzht"

10/22なんで1週間以上前のつぶやきだけど、うーんやっぱなんか発表してみたいなぁ。

HIMA & 忘年会 - あどけない話 忘年会出てみたいなぁ

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

2009-10-29

本「プログラミングHaskell」

プログラミングHaskell
Graham Hutton
オーム社
売り上げランキング: 32411

11/11発売予定らしい。\2,940ならまあ許容範囲。

でもオーム社で検索してもページが出てこない。

追記:Ohmsha | 商品一覧

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

2009-10-24

Haskellナイト

へそまがり算法騎士團プレゼンツ Haskellナイト

該当公演なし

Real World Haskell―実戦で学ぶ関数型言語プログラミング
Bryan O'Sullivan John Goerzen Don Stewart
オライリージャパン
売り上げランキング: 2148

Haskell本の著者翻訳者(交渉中)」ってのはたぶんProgramming in Haskell翻訳をされたというkazu-yamamotoさんだよね。行きたいよう、でも急だね!

Haskellゴングにも出てみたいね、でもネタがない!

cut-seacut-sea2009/11/05 00:12ネタは何でもいいですよ!
是非参加してください。

mokehehemokehehe2009/11/06 11:26もうちょっと考えて、何か出来そうだったら応募させていただきます!

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

2009-10-06

あとで読む

>>78

Yhcのソースでも読んで見りゃいいんじゃない?

http://www.haskell.org/haskellwiki/Yhc

関数型プログラミング言語Haskell Part11

Implementing lazy functional languages on stock hardware: the Spineless Tagless G-machine でも読んだら?

関数型プログラミング言語Haskell Part11
トラックバック - http://haskell.g.hatena.ne.jp/mokehehe/20091006

2009-08-15

「Write Yourself a Scheme in 48 Hours」はSchemeの環境をどうやって扱っているか?

Haskell パーサ」とかでつらつら巡回してたら404 Not Foundが出てきた。自分の目的と同様に、HaskellSchemeのインタプリタを作るという内容なので、環境をどう扱うか書いてあるかと思ってオリジナルの方をちゃんと読んでみる。

Eitherはモナド
*Main> :i Either
data Either a b = Left a | Right b      -- Defined in Data.Either
instance (Eq a, Eq b) => Eq (Either a b) -- Defined in Data.Either
instance (Ord a, Ord b) => Ord (Either a b)
  -- Defined in Data.Either
instance (Read a, Read b) => Read (Either a b)
  -- Defined in GHC.Read
instance (Show a, Show b) => Show (Either a b)
  -- Defined in GHC.Show
8. Adding Variables and Assignment: Mutable State in Haskel

グローバル環境の追加

  • Stateモナドだとクロージャのように環境を保存するものがあって扱いきれない
  • state threadsと呼ぶ、状態を扱う方法を使う
    • 1.STモナドを使う
    • 2.IORefを使う
      • どうせ処理はIOによって細切れにされてるのでかまわん
  • IORefを使う
import Data.IORef

type Env = IORef [(String, IORef LispVal)]
9. Defining Scheme Functions: Closures and Environments
  • 関数にIORef環境を保存
10. Creating IO Primitives: File I/O
  • I/Oもしちゃう、すげぇ!
結論

IORef+モナド変換か…気が進まないけどやるっきゃない!

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

2009-08-05

orMaybe

Maybe型の >>= とは逆に、Justだったらその値を返して Nothingだったら検索を続ける orMaybe 関数があると便利:

orMaybe :: Maybe a -> Maybe a -> Maybe a
Just v  `orMaybe` _     = Just v
Nothing `orMaybe` alter = alter

ローカル変数だったらそれを返して、なかったらグローバル変数から探して返す、みたいなことが簡単にできる:

refvar :: String -> IntpState -> Maybe Value
refvar name st = lookupFromLocal `orMaybe` lookupFromGlobal
	where
		lookupFromLocal  = curenv st >>= search
		lookupFromGlobal = lookup name (global st)
		search (Environment dic parent_env) =
			lookup name dic `orMaybe` (parent_env >>= search)

maybeを使って書くと

a `orMaybe` b = maybe b Just a

わかりにくい…。

ラムダ関数を追加する

電卓で任意の型の値を扱えるようにする - mokeheheの日記 - haskellで関数をファーストクラスの値として扱えるようになったので、関数に渡したりできる:

> twice f x = f (f x)
<function>
> sq x = x * x
<function>
> twice sq 10
10000.0

でもグローバル関数しかないので、環境とかなにも考えなくてすんでいた。

ラムダ関数を追加しようとすると、レキシカルな環境のチェーンを作る必要がある。その場合にHaskellでどう実装したもんかとはたと困った。電卓には代入があるので環境の値が書き換えられる可能性があるので、IORefみたいに書き換えられるデータ型を使う必要があるのか?でも構文木の評価はStateモナドで行っていて、その中でIORefは使えるのか?

ちょっと難しいので、とりあえず後からの書き換えは考えず、たんに環境のチェーンだけを行ってクロージャを作れるようにしてみる。

まずはパーサにラムダ式を追加する。Haskellのラムダ式の形式「\args -> body」で:

factor = lambda <|> try(funcall) <|> primFactor

lambda = do
	lexeme $ char '\\'
	args <- many1 identifier
	lexeme $ string "->"
	e <- expr
	return $ Lambda args e

評価器の変更として、まず環境に親環境を追加:

data Environment = Environment Dictionary (Maybe Environment)

ラムダ式が出てきたときに、関数の生成にその文脈の環境を保持するように渡す:

eval (Lambda args body) = do
	st <- get
	let func = Function args body $ curenv st
	return func

関数呼び出し時は、関数のレキシカル環境を関数への実引数で拡張して本体呼び出し:

call fnode (Function args body env) params =do
	st <- get
	put $ st { curenv = Just (extend args params env) }
	res <- eval body
	put st
	return res

テスト:

> make_adder x = \y -> x + y
<function>
> twice (make_adder 1) 100
102.0

以下ソース:

続きを読む

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