タグ

ブックマーク / myuon-myon.hatenablog.com (10)

  • 処理の切り替えとFreezeパターン - Just $ A sandbox

    以下、Objectというとメソッドと適当な引数を与えると自分自身を返したり返さなかったりするデータ型、またはobjectiveのObjectということにしておきます。 newtype Object xs = Object { runObject :: forall a. Methods xs a -> ctx (Object xs) a } さてオブジェクトを実行し続けて、あるタイミングで別の処理に切り替えたいということはままある。一番よくある例ではあるタイミングでオブジェクトが死ぬ、死んだらオブジェクトを破棄する処理に移行する、みたいなことがしたい、とか。 そのままオブジェクトを丸ごと破棄してGCに回収させればよいのであれば何も考えなくていいんだけれど、大抵の場合は後処理があり、後処理には死ぬ直前のオブジェクトからデータを拾ったり、ということはまぁあるよねと。 おそらく一番簡単なのは i

    処理の切り替えとFreezeパターン - Just $ A sandbox
  • monadからeffectへ - Just $ A sandbox

    追記 もう少しまともなeffect入門記事を書きました myuon-myon.hatenablog.com この文章は今から5-10年後に万が一effect systemが流行り始め、今のHaskellのような立ち位置になった場合に備えて書いています。 effect systemについて Haskellはモナドを用いて純粋・非純粋を切り分けることができる言語で、computational effectを扱うために導入されたものだった。 かつては関数 A -> B で一緒くたにしていたcomputationは、 A -> T B と、文脈 T をもった関数として表現できるようになった。ところでこのようなcomputational effectとしてのモナドを言語機能に組み込むには2つの方法があって、 Meta Language方式 (Haskell) Programming Language

    monadからeffectへ - Just $ A sandbox
  • Notions of Computations and Effects - Just $ A sandbox

    前回のeffect systemに対するボヤキ、あるいは予言が色んな人に読まれたみたいなので興味がある人が一定数いるならeffect systemの紹介記事をちゃんと書こうと思った次第。 というわけでmonadを前提としてプログラミング言語的な見方と圏論的な見方を通してeffectに関するお話をしてみます。 注意 以下のプログラムはHaskellに寄せたオレオレsyntaxで実際にそういう実装があるわけじゃないので注意してください。実際の実装されている言語の話は最後に少しします。 programming with effects effectは通常type-and-effect-systemと呼ばれるようにある意味で一種の型システムのようなものです。型システムがプログラムの入力と出力の値を見積もる仕組みだったのに対し、エフェクトシステムはプログラムを実行した際に「起きうる」エフェクトをコン

    Notions of Computations and Effects - Just $ A sandbox
  • Free Monadic Parser - Just $ A sandbox

    動機 Haskellでは * -> * カインドを持つデータ型からFreeモナド(Operational)を使って5秒でDSLが作れることは有名だけど、 そうやって作ったDSLをスクリプトとして外部ファイルから読み込むようなことがしたいこともあるかもしれない。 そういう時にわざわざパーサーを頑張って1から書くのはしんどいし、うまい具合にやってくれてもいいのだろうか、という話。 結論から言うとある程度うまい具合にできます Freeモナドについて FreeモナドはFreeなので特別なprimitive operationは定義されていないから、モナドのoperationだけをパースすることを考えればいい。 つまり、 ex = do Con1 x y t <- Con3 a b c Con4 t のようなものがパースできればよさそうなことがわかる。 来はモナドで定義可能な関数(whenとか)は

    Free Monadic Parser - Just $ A sandbox
  • Object型とOpenUnion - Just $ A sandbox

    Table of Contents 1. Widget型 1.1. 直和と直積 2. 内部状態 3. Widget Operation 4. 継承、合併 5. 関係ないけれど 6. おわりに 今現在Haskellを使ってゲームを作っていて、そこで「オブジェクト」的なものが欲しくなってあれこれした結果を説明として残しておきたいので書きます。 Haskellでオブジェクト指向をエミュレートするのには objective というのがあるんだけどまぁ大体そういう感じの話です。 Widget型 ゲーム内では、Widgetと呼ばれる、画面上に表示されたり内部状態が変化して見た目が変わったりするコンポーネントを扱うことにしている。 つまり画面に表示されたりするUIを司るための型を用意しておいて、それに対して特定の信号を送ると内部状態が変化したりしなかったりする。 Widget型の定義は以下の通り new

    Object型とOpenUnion - Just $ A sandbox
  • Tagless-finalによるデータ型の間の変換 - Just $ A sandbox

    Q. Tagless-finalってなんぞや A. (in short) データ型DをF[D]のinitial algebraとみなしたとき、initialityより、任意のalgebra F[D](X) --> Xに対してunique transformation D --> Xがある。 このときfamily forall X. F[D](X) --> XをDのTagless-final representationとよぶ。 A. (in plain and concrete context) Tagless-final representationというのがあり、なんぞやみたいなお話。 コードで詳しくみていきます まずListの標準的なrepresentationは List[a] = 1 + a × List[a]になる。 データコンストラクタは Nil: 1 -> List[a]

    Tagless-finalによるデータ型の間の変換 - Just $ A sandbox
  • オートマトンで遊ぶやつを作った - Just $ A sandbox

    この記事はHaskell Advent Calendar 2015 18日目の記事です. Automatoy(オートマトン)で遊ぶやつを作ったので紹介します. github.com ブラウザで遊べる. 以下それっぽい解説. Automatoyについて http://myuon.github.io/automatoy/ "Def"タブでオートマトンを定義. "Check"タブで与えられた文字列のacceptance checkができる. "Conversion"タブでいくつかのサンプルオートマトンを読み込んだり, NFAをDFAに変換(いわゆるpowerset construction)できる. また, 右上のImport/Exportでjsonに変換したり, jsonを読み込んだりできる. もう少し扱えるオートマトンのバリエーションを増やしたり, acceptance checkにアニメー

    オートマトンで遊ぶやつを作った - Just $ A sandbox
  • Lens from Scratch - Just $ A sandbox

    久しぶりのLensの記事です. 5億回は繰り返されてきたであろうLens再実装を通して, Lens, Getter, Setter, Iso, Equality, Traversal, Prism, Foldの仕組みを理解するのが目的です. 亜Lens family Getter Getterは基的にはConstをかぶせる操作とそれを剥がす操作で実現可能です. つまりgetConst (Const k) = kですが, このConst kがデータであり, getConstは値を取り出すgetterになります. アクセサの型がGetting r s aであるとき, sからaを取り出せる(=s -> aなるgetterである)という意味です. (^.)はGetterとデータから具体的に値を取り出し, toは函数をGetterに変換するための函数です. type Getting r s a =

    Lens from Scratch - Just $ A sandbox
  • Printf実装を通して学ぶGADTs, DataKinds, ConstraintKinds, TypeFamilies - Just $ A sandbox

    問題 問. Haskellで以下のようなCライクなprintf函数を実装してください。 > printf ["Hello, ", _s, "\n", "an integer:", _d, "\n", "a float:", _f] ["World!", (10 :: Int), (3.1415 :: Float)] -- 出力結果: > Hello, World! > an integer:10 > a float:3.1415 Cのprinfとは異なり、%dや%fが文字列に直接埋め込まれていません。よって当然型が合わなければ、すなわち printf [_d] [(3.1 :: Float)] などとかくとコンパイルエラーになってほしいわけです。 解答 私が実装したものが以下にあります。 https://gist.github.com/myuon/9084939 以下ではこのコードについて

    Printf実装を通して学ぶGADTs, DataKinds, ConstraintKinds, TypeFamilies - Just $ A sandbox
  • Haskellでもできる!実践・オブジェクト指向 - Just $ A sandbox

    Lensにほとんど触れたことのない人にはこちらの記事がオススメです:Lensで行こう! - Just $ A sandbox Haskellでもオブジェクト指向をしましょう! Haskellは直接オブジェクト指向的な機能を提供してはいませんが、我らがLensの力を借りることでオブジェクト指向的な設計を意識したコーディングが可能です。 今回利用するのは主に以下のモジュールです。 Control.Lens.Lens Control.Lens.Getter Control.Lens.Setter Control.Lens.TH Lensのおさらい Lensを使ったことのある人にはおなじみだと思いますので、特に解説はしません。 type Lens s t a b = forall f. Functor f => (a -> f b) -> s -> f t -- Lens型(GetterやSett

    Haskellでもできる!実践・オブジェクト指向 - Just $ A sandbox
  • 1