読者です 読者をやめる 読者になる 読者になる

Haxe 2 から 3 へ

Haxe のバージョンを 2.10 から 3.0.0 に更新した。 Haxe 2 の時のコードが結構動かなくなったので、変更点をメモ。 interface 継承の変更 implements -> extends haxe 2 interface Hoge {} interface Piyo implements Hoge {} haxe 3 interface Hoge {} int…

prototype でつけた関数をファーストクラスで使うと this がしぬ

はまりかけた。 コンストラクタで設定すればおk。 function Hoge() { var me = this; me.print1 = function() { console.log(me); }; } Hoge.prototype.print2 = function() { console.log(this); } var hoge = new Hoge(); hoge.print1(); // Hoge {print1…

型パラメータとミックスイン

Mix.hx interface A {} interface B {} class C implements A, implements B { public function new() {} } class Mix { public static function hoge(x: A) {} public static function piyo(x: B) {} } Hoge.hx using Mix; class Hoge { public static func…

構造体と型

typedef X = { id: Int, name: String } class Hoge { public static function hoge(x: X) {} public static function main() { hoge({ id: 0 }); } }これはエラー。 $ haxe hoge.hxml Hoge.hx:5: characters 7-16 : { id : Int } has no field name Hoge.hx…

関数の型

var f: Int -> Int -> Int = function(a, b) { return a + b; }; var g: Int -> (Int -> Int) = function(a) { return function(b) { return a + b; }; }; var h: (Int -> Int) -> Int = function(f) { return 0; };えー。

type 演算子?

プログラム中のどこでも,ある表現の型を知るためには,type 演算子を使うことができます。コンパイル時に,type 演算子は除去され,表現だけが残ります : var x : Int = type(0);この例ではコンパイル時に Int と表示され,type が使われなかった場合と同じ…

今のバージョンでYesodアプリを動かすまで

なんかうまく動かなくなってたので、メモ。 まずは、Haskell Platform を確認。 気がついたら64bitが入っていた。 多分 2012.4.0.0 にするときに誤って入れたらしい。 一旦今の Haskell 環境を消して、 $ sudo /Library/Haskell/bin/uninstall-hs --remove t…

同じようなフィールドを持ったレコードへの変換

RecordWildCards を使って、同じようなフィールドを持つレコードを簡単に変換できる。 RecordA.hs module RecordA where data A = A { a :: Int, b :: String, c :: Int } deriving Show RecordB.hs module RecordB where data B = B { a :: Int, b :: Strin…

Haskellの言語拡張たち 2

前のやつ の続き。 今回調べた拡張 レコード系 RecordWildCards 型系 ExistentialQuantification RecordWildCards レコードワイルドカードが使える。 レコードパターン中で .. とすれば、レコード内のフィールドを一気に束縛したり、現在のスコープの変数か…

一部の値を変更したレコード

Database.Persist.MySQLの設定を調べていて、こんな記述を発見。 defaultConnectInfo :: ConnectInfo Default information for setting up a connection. (中略) Use as in the following example: connect defaultConnectInfo { connectHost = "db.example.…

Haskellの言語拡張たち

前回、なんか拡張を沢山使っていたが、おまじないのままなのもそろそろまずい感じなので、とりあえず調べてみた。 今回調べた拡張 型系 GADTs ScopedTypeVariables EmptyDataDecls TypeFamilies 型クラス系 MultiParamTypeClasses TypeSynonymInstances Flex…

Haskell で DB操作

最近 Yesod を弄っているが、Yesod で使ってるやつ (Database.Persistent) を使って、普通に DB 操作したいな、と。 sqlite と mongodb をやってみる。github にあげた分 → https://github.com/rf0444/haskell-dbとりあえず自分の環境 (Mac) で runhaskell …

The End of Start Haskell

1/28 に、第6回 スタートHaskell に行ってきました!また1週間かかってしまった・・・遅延評価だから仕方がない (キリッ 12章 遅延評価 解説 @imsuten http://www.intransient.info/materials/Programming_in_Haskell_12/Programming_in_Haskell_12.html5.html#…

Purely Functional Data Structures読書会 第4回

1/21 に、Purely Functional Data Structures読書会 第4回 に行ってきました。 まとめ的な: http://wiki.haskell.jp/Workshop/ReadPFDS/4 3.4 (c) (d) @khibino 前回末尾再帰になっていなかったから、CPS変換して末尾再帰にしたらしい。 なんかいきなり継続…

Purely Functional Data Structures読書会 第3回

12/17 に、Purely Functional Data Structures読書会 第3回 に行ってきました。 開始前 Mac (Lion) のデスクトップ増やす: Mission Control から カーソルを右上の方にやると「+」が出てくる。 押すと増える。 Lion から操作が変わった部分は、わりと前から…

第5回 スタートHaskell

12/5 に、第5回 スタートHaskell に行ってきました! 会社の先輩 (@seizans) に誘われて、久しぶりの勉強会 & 初スタートHaskell! 前日 本の中身をざっくりみた後、演習をやっておこうとした。 環境をみてみると、Haskell Platform 入れてなくて、 Mac Por…

Jaav っぽいの

なんか bleis 先生が関数型っぽいライブラリを Java で作ってるっぽくて、自分も作ってみようかなーって適当に作ってたらとても残念な感じになったのでのっけてみる。 コードは rf0444's jaav at master - GitHub に。 よくもこんなキチ(ry まずは Function …

reflexivityつおい

Require Import List. Theorem sum_10_eq_55 : fold_left (fun y x => y + x) (seq 1 10) 0 = 55. Proof. reflexivity. Qed.ぅゎ、reflexivity っぉぃ。

続・Coqりさん Q.E.D.

Coqりさん 証明のかけら の続き (再挑戦)。 Require Import Arith. Fixpoint fib1 n:nat := match n with | 0 => 0 | 1 => 1 | S (S m as p) => fib1 p + fib1 m end. Fixpoint fib2 n a b:nat := match n with | 0 => a | S n => fib2 n b (a + b) end. Lem…

SKK とか

K I = F と、S K K = I を証明してみる。 Definition I {A:Type} x:A := x. Definition K {A B:Type} (x:A) (y:B) := x. Definition F {A B:Type} (x:A) (y:B) := y. Definition S {A B C:Type} (x:A->B->C) (y:A->B) (z:A) := x z (y z). Theorem ki_f : fo…

|> in Scala

F# の |> を Scala でやってみた。 scala> class Holder[A](a:A) { | def |>[B](f:A => B) = f(a) | } defined class Holder scala> implicit def any2holder[A](a:A) = new Holder(a) any2holder: [A](a: A)Holder[A] scala> val succ = (x:Int) => x + 1 s…

矛盾

楚人に盾と矛とを鬻(ひさ)ぐ者有り。之(これ)を誉めて(ほめて)曰く「吾が盾の堅きこと、能く(よく)陥す(とほす)もの莫し(なし)」と。また、その矛をほめていはく、「わが矛の利なること、物において陥(とほ)さざることなきなり。」と。あるひ…

NotNull

NotNull型を継承すれば、自分で作った型に関しては、nullが入らないことを静的に保証することができます。 class X extends NotNull { ... } とすると、X型の変数にはnullが入れられません。 http://twitter.com/kmizu/status/21992714816 やってみる。 scal…

Coqりさん 証明のかけら

Coq りさん Coq りさん、フィボナッチ数列の末尾再帰にしたやつって、本当に元のと同じなんですか? Fixpoint fib1 (n : nat) : nat := match n with | 0 => 0 | 1 => 1 | S n => fib1 n + fib1 (pred n) end. Fixpoint fib2 (a b n : nat) : nat := match n…

れんしう

∃a∀b[P(a, b)] → ∀b∃a[P(a, b)] Lemma exists_forall : forall (A:Type)(P: A -> A -> Prop), (exists a:A, forall b:A, P a b) -> (forall b:A, exists a:A, P a b). Proof. intros A P H1 a. elim H1. intros x H2. exists x. apply H2. Qed.

Maybe/Option のリストから普通のリストへ

Ocaml の時は自作したけど、Scala と Haskell は結構簡単にできる。 ↓Scala scala> List(Some(4), Some(2), None, Some(9), None, Some(0)) flatMap (x => x) res0: List[Int] = List(4, 2, 9, 0) ↓Haskell > [Just 4, Just 2, Nothing, Just 9, Nothing, Ju…

遊んだ

久々に (?) Scala で遊んでみる。 再帰さん scala> def z[A,B](f: (A=>B) => (A=>B)): A=>B = (x:A) => f(z(f))(x) z: [A,B](((A) => B) => (A) => B)(A) => B scala> z { (f:Int=>Int) => (n:Int) => if (n < 2) n else n * f(n - 1) } (10) res2: Int = 36…

liftとか

liftで遊んでみる。 > :t map map :: (a -> b) -> [a] -> [b] > :t fmap fmap :: (Functor f) => (a -> b) -> f a -> f b > :t liftM liftM :: (Monad m) => (a1 -> r) -> m a1 -> m r > :t liftM2 liftM2 :: (Monad m) => (a1 -> a2 -> r) -> m a1 -> m a2 …

Proof Cafe

4/25に、Proof Cafe (栄)に参加してきました。 Coq 初体験。 最初は、id:yoshihiro503 さんから資料に沿って Coq の解説が。 Vernacular が分かれば Coq が分かる? Coq のファイルの拡張子は .v Checkで 型を調べる。 ガリナ(Gallina):ラムダ式 nat : 型を…

関数合成・・・

. こわい。 > ((.) . (.)) succ (+) 1 2 4 > ((.) . (.)) length (++) "hoge" "piyo" 8 > ((.) (.)) (+) 1 succ 2 4

do みたいな for

Scala の for を Haskell の do みたいに使ってみる。 Haskell f :: Maybe Int -> Maybe Int -> Maybe Int f am bm = do a <- am b <- bm let c = a + b return (2 * c) > f (Just 3) (Just 1) Just 8 > f Nothing Nothing Nothing > f (Just 3) Nothing Not…

第5回名古屋Scala

3/19に、第5回名古屋Scala勉強会に参加してきました。 今回は継承とかトレイトとか。 ScalaのforはOption型でも使えて、Haskellのdoみたいに使えるなーとかいう話題があった。 scala> val x = Some(3) x: Some[Int] = Some(3) scala> for (i <- x) yield (i …

foldを使ってfoldを作る

foldr/foldl を使って、foldl/foldrを作ってみる。 myFoldL :: (a -> b -> a) -> a -> [b] -> a myFoldL f y xs = foldr (\x g a -> g $ f a x) id xs y myFoldR :: (a -> b -> b) -> b -> [a] -> b myFoldR f y xs = foldl (\g x a -> g $ f x a) id xs y -…

Yコンビネータ

フィボナッチと階乗やってみる。 > let y f = f $ y f > :i y y :: (b -> b) -> b -- Defined at <interactive>:1:4 > y (\f n -> if n < 2 then n else f (n-1) + f (n-2)) 7 13 > y (\f n -> if n < 2 then n else f (n-1) + f (n-2)) 100 Interrupted. ← (´・ω・`)ショホ</interactive>…

RWH 4章練習問題1

なんか作るのにすごい時間かかった・・・ リストを述語で分割 splitWith :: (a -> Bool) -> [a] -> [[a]] splitWith f [] = [] splitWith f xs = case span f xs of (a,b) -> a : (splitWith f $ snd $ span (not . f) b) > splitWith (/= 'a') "igaiahaidih…

リストとか

Scalaでやってたやつとか。 平方数 > take 10 $ zipWith (*) [1..] [1..] [1,4,9,16,25,36,49,64,81,100] > take 10 $ map (\x -> x * x) [1..] [1,4,9,16,25,36,49,64,81,100] 総和と総積 > foldl (+) 0 [1..10] 55 > foldl (*) 1 [1..10] 3628800 > foldl1…

中置関数

map とかって、中置で使うとOO系言語と逆になるんだよなぁ・・ > :info map map :: (a -> b) -> [a] -> [b] -- Defined in GHC.Base > (\x -> x + 1) `map` [1..10] [2,3,4,5,6,7,8,9,10,11] > succ `map` [1..10] [2,3,4,5,6,7,8,9,10,11] > let myMap a b …

Haskellやる!

Real World Haskell―実戦で学ぶ関数型言語プログラミング が研究室に入ったので、本格的に Haskell やってみようかと。 とりあえず、3章まで読んだ。 目指せリア充! (注:「Real World Haskell充」の略) 小ネタ: 3項演算子 > let (+++) a b c = a + b + c …

Y(Z)コンビネータ

無名関数が再帰できるとか。 scala> def Y[A,B](f:(A=>B)=>(A=>B))(x:A):B = f(Y(f))(x) Y: [A,B](((A) => B) => (A) => B)(A)B scala> Y((f:Int=>Int) => (n:Int) => n match { | case m if m < 2 => m | case _ => f(n-1) + f(n-2) | })(7) res1: Int = 13…

関数、掛け算

scala> 1 to 8 map(1+) foreach print 23456789 scala> println("hoge" * 4) hogehogehogehoge こんなこと出来たんだ。

中括弧

if の条件の部分は小括弧を中括弧に出来ないっぽい。 while も出来ないっぽい。 for とかは出来るのに。 逆に match は中括弧じゃないと駄目みたい。 scala> { for { i <- 1 to 3 } yield (i) } foreach print 123 scala> def inc(a: Int) = a + 1 inc: (a: …

ファイル1

カレントディレクトリ内のbatファイルの行数を数えてみる。 scala> import java.io._ import java.io._ scala> import scala.io._ import scala.io._ scala> new File(".") getCanonicalPath res0: java.lang.String = C:\Users\rf\Documents\scala\bin scal…

関数合成

やってみる。 scala> val f1 = (a:Int) => a + 1 f1: (Int) => Int = <function> scala> val f2 = (a:Int) => a * 2 f2: (Int) => Int = <function> scala> val fs = List(f1, f2, f1, f1, f2) fs: List[(Int) => Int] = List(<function>, <function>, <function>, <function>, <function>) scala> (Function chain fs)(3) res31:…</function></function></function></function></function></function></function>

カリー化

おー。 scala> def add(a: Int, b: Int) = a + b add: (Int,Int)Int scala> add(2, 3) res0: Int = 5 scala> val add_ = Function.curried(add _) add_: (Int) => (Int) => Int = <function> scala> add_(2)(3) res1: Int = 5 scala> val inc = add(_: Int, 1) inc: (I</function>…

コマンドリスト

scala> List(() => println("a"), () => println("b")) foreach(_()) a b

無限リスト

作ってみる。 平方数 scala> val s = Stream from 1 map(x => x * x) s: Stream[Int] = Stream(1, ?) scala> s take 16 foreach(printf("%d ", _)) 1 4 9 16 25 36 49 64 81 100 121 144 169 196 225 256 繰り返し scala> Stream from 0 map(x => x % 3 + 1)…

DFT

学部3年生がCで頑張ってる所。 scala> def dft(xs: List[Double]) = { | import java.lang.Math._ | val N = xs size; | for (k <- 0 until N) yield { | val as = for (n <- 0 until N) yield { | xs(n) * cos(2 * PI * n * k / N) | } | val bs = for (n <…

クイックソート

作ってみる。 scala> def qsort[T <% Ordered[T]](xs: List[T]): List[T] = xs match { | case List() => List() | case y::ys => | qsort(ys filter(_ < y)):::List(y):::qsort(ys filter(y <= _)) | } qsort: [T](List[T])(implicit (T) => Ordered[T])Lis…

総和と総積

ほー。 scala> (1 to 10).foldLeft(0)(_ + _) res52: Int = 55 scala> (0 /: (1 to 10))(_ + _) res53: Int = 55 scala> (1 to 10).foldLeft(1)(_ * _) res54: Int = 3628800 scala> (1 /: (1 to 10))(_ * _) res55: Int = 3628800 追記 scala> 1 to 10 redu…

チャー研

「謎のプログラマ」的な。 ☆「泉君、たなびたいことがあるんだ、ちょっと。」 ☆「一度でいいから、君のプログラムを。」 研「どうして君が?」 ☆「あこがれているんだ。関数型言語に。」 ☆「さぁ、早くプログラムを見せてくれ。」 ☆「一回きり見せてくれれば…