タグ

型推論に関するlugecyのブックマーク (6)

  • Rubyコード補完進捗報告1 - Functional Emacser

    ここ二週間ほど、集中して取り組んだおかげで、一応それっぽく動くようになりました。問題は山積みで実用などは遥か遠い未来の話ですが、ちょっと嬉しかったので報告です。次のスクリーンショットを見てください。 なんの変哲のない補完に見えますが、よく見ると補完候補としてFixnum#succとString#gsubが含まれているのが分かります。これの意味するところは、ローカル変数aへのFixnumオブジェクトとStringオブジェクトの代入が正しく検知され型推論されているということです。 分かりやすさのために、あえてこんな単純な例を出していますが、前のエントリにあるようなケースも現状ですでに対応できています。 def foo(n) n. # <= succ, gsubが候補として出てくる end foo(1) foo('Hello') 一応プロジェクトのURLを貼っておきます。 http://code

    Rubyコード補完進捗報告1 - Functional Emacser
  • DDP: Demand-Driven Analysis with Goal Pruning

    Overview DDP is an approach to static program analysis. It was developed in the Chuck project. Chuck is a program-editor (analogous to Eclipse, Dr. Scheme, Star Browser, ....) for Squeak Smalltalk. It faces a combination of challenges including large programs (300 kloc), higher-order control flow, a high rate of programmer-driven code changes, and no static types to fall back on. Technically, the

  • http://www.tom.sfc.keio.ac.jp/~sakai/d/?date=20021008

  • Hindley-Milnerの型推論 - ラシウラ

    アルゴリズムについてのメモ 構文: 変数参照(ref)、関数適用(apply)、lambda、let, letrec 整数や文字列などは特別なref扱いで 型宣言はない 型: 多相型と具体型、単一型(アトム)と組合せ型(関数とかタプルとか) 推論型: 構文上の問題から仮に割り当て、チェック時には仮に多相型のようにユニファイしていくことで固定化する具体型。ユニファイでは多相型のように処理するが、処理後は具体型として参照する内部型。仮引数や再帰関数など。 型環境: [(識別子, 型)] 構文ツリーでのlambdaやletごとに親子構造をとる継承式辞書 built-inの名前の型をトップに入れておく 型チェック: (構文木、型環境) -> 型 or 型エラー (構文ノードの種類ごとに再帰的に処理、結果としてそのノードの型を取り出す) 変数参照: 型環境から取り出す 関数適用: 使っている関数の型

    Hindley-Milnerの型推論 - ラシウラ
  • 型推論

    OCamlの 型推論 ---- OCamlとは ---- プログラミング 言語の ひとつ ---- 型推論 とは ---- 型を推論 すること ---- 例 ---- fun a b c → c(if a then b else "あ") + 5 ---- 型は書いて ないけど ---- fun a b c → c(if a then b else "あ") + 5 <font color="red">: bool→string→(string→int) →int</font> ---- コンパイラが 自動で 推論 ---- 直感的に 言うと ---- (if a then ...) ということは ---- a は bool に ---- 決定 ---- (... then b else "あ") ということは ---- b と "あ" は 同じ型 ---- つまり b は ---- st

  • 第12回 「型推論」の実装法

    型推論:「コンピュータ以前」からML,Java 7まで OCamlをはじめ,MLやHaskellなど,多くの型付き関数型言語には型推論という機能がある。この連載でも,暗に陽に,OCamlの型推論機能を利用してきた。 例えば,以下のような関数say_hello_toを定義してみよう。文字列引数nameを受け取り,nameの前に定数文字列"hello "を付け加えて返す,という関数だ。 # let say_hello_to name = "hello " ^ name ;; val say_hello_to : string -> string = <fun> このように,引数や返り値の型を指定しなくても,say_hello_toはstring ->string型(文字列を受け取り,文字列を返す関数)であると自動推論される。 ただし,(例えばプログラムを読みやすくするために)もし型を書きたけれ

    第12回 「型推論」の実装法
  • 1