タグ

proofに関するcooldaemonのブックマーク (2)

  • 第14回 型=命題,プログラム=証明

    MLの型と型推論 この連載でも何回か触れたが,MLやHaskellなど多くの静的型付き関数型言語には,「型推論」という機能がある。これは,プログラム中の変数や関数の型を省略しても,「もっとも一般的」な型を言語処理系が勝手に推論してくれる,という機能だ。 例えば,次のように,二つの引数xとyを受け取って,(x, y)という組を返す関数pairを定義してみよう。 > ocaml Objective Caml version 3.10.0 # let pair = fun x y -> (x, y) ;; val pair : 'a -> 'b -> 'a * 'b = <fun> # このように,pairは「何らかの型'aを持つ値と,何らかの型'bを持つ値を受け取り,'a型の値と'b型の値の組を返す」と推論される。一般に,t1 -> t2は,型t1の値を受け取って,型t2の値を返す関数の型であ

    第14回 型=命題,プログラム=証明
  • scalaz.Forall を読む - 月の塵

    ScalaScala では def で定義されたメソッドだけが多相性を持つことができ、値である関数は多相性を持つことができない。メソッドを関数に変換すると、そこで型パラメータが適当な型に特定化される。 scala> val id = identity _ id: Nothing => Nothing = メソッドの引き数に多相的な値を渡したりと rank-n 多相のようなことをしたいときにこれでは困ることがある。 scalaz の Forall は、そのようなときに Scala の型システムの範囲内で全称量化された値を扱うためのパッケージである。このパッケージには scala> val singleton = new Forall[({ type X[A] = A => List[A] })#X]{ | def apply[A] = (x : A) => List(x) | } sing

  • 1