タグ

2014年4月5日のブックマーク (4件)

  • F#入門

    コンビネータ ラムダ計算の親戚みたいな理論として、コンビネータ理論がありますが このページの趣旨は、理論的なことはさておき コンビネータを使って遊んでみようというものです。 例えばコンビネータを使うと 「引数の順序を入れ替えたり、入れ替えて適用する」 といったことができます。 なお、ここではλ式について少し知識があることを仮定しています。 最初にコンビネータとは何かというと 「自由変数を含まないλ式」、と定義されています。 自由変数とはλ式において束縛されていない変数のことで letによる関数定義をλ式の定義とみなすと 引数が束縛変数、 既に定義されてる識別子が自由変数 になります。 コンビネータに関するとして スマリヤンの「To mock a mocking bird」 (邦題:数学パズル ものまね鳥をまねる―愉快なパズルと結合子論理の夢の鳥物語) は有名です。 このの楽しいところ

  • Haskell, OCaml の型変数と全称量化について

    Haskell の型注釈における a と OCamlの型制約における 'a の違いについて。 OCaml では forall になるとは限らないが、Haskell では forall になる。 Haskell で forall にしない型変数が欲しいときには、例えば UHC の拡張の Partial type signature を使うとできる。 OCaml で特に型変数を割りあてる必要が無いときには _ を使うこともできる。 続きを読む

    Haskell, OCaml の型変数と全称量化について
  • HaskellでASTからのコード生成(1) Writer+Stateモナドによる構造化 - プログラミングの実験場

    前のポストでGADTを使って型付きの抽象構文木(AST)を表現する方法について書いたが、ここではそのASTから他の言語のコード生成する方法について調査・検討した結果を記す。@keigoiさんの記事(http://d.hatena.ne.jp/keigoi/20111206/haskell_tagless_dsl)に触発され、一部借用したものである。なお、今回のコード生成の方法論はASTの型付き・型なしの区別にかかわらず使える。 MatlabのDSL in Haskell 今回例として扱うのは、Matlab(行列計算言語・統合環境)の行列計算を表現するようなDSL。最小構成として、2次元行列の加減乗算と要素の取り出しを表現したい。(Matlabの文法の簡単な説明はこれなどを参照。 http://www.math.meiji.ac.jp/~mk/labo/text/matlab/node4.h

    HaskellでASTからのコード生成(1) Writer+Stateモナドによる構造化 - プログラミングの実験場
  • GADTによるHaskellの型付きDSLの構築 - プログラミングの実験場

    GADTについて、この解説が分かりやすい(英語)。 http://en.wikibooks.org/wiki/Haskell/GADT 背景 Haskell(というか関数型言語一般)の素晴らしい機能の一つ、代数的データ型を使うと、抽象構文木(AST)をHaskellの枠組みの中で表現できる。 例えば、整数の足し算・引き算ならば、 data Exp = Const Int | Add Exp Exp | Subtract Exp Exp さらにこのASTを数値一般に使いたいので型パラメータrをつけて多相にしてみる。 data Exp r = Const r | Add (Exp r) (Exp r) | Subtract (Exp r) (Exp r) これを使えば、例えば(3 + 4) - 2という数式は、Subtract (Add (Const 3) (Const 4)) (Const

    GADTによるHaskellの型付きDSLの構築 - プログラミングの実験場