2011-01-01から1年間の記事一覧

データ構成子とか関数合成とか

リストを引数として受け取り、head関数を適用した後Foo型構成子に放りこんで返すheadFoo関数を考えます。 module Main where data Foo a = Foo a deriving Show headFoo a = Foo (head a)ここで、データ構成子Fooは「a -> Foo a」という関数と見なせるので、…

Haskellでチューリングマシン(2) テープの処理をモナドに

前回のエントリのテープに対する処理を、モナドに包んだだけです。 module Machine(TapeValue(..)) where --テープの値は 0 または 1 data TapeValue = T0 | T1 deriving Eq instance Show TapeValue where show T0 = "0" show T1 = "1" --無限長の長さを持…

Haskellでチューリングマシン(1) 無限の長さのテープを作る

そろそろ簡単なテストコードを書き連ねるより、それなりの規模のものを一つ作ってみるのが良いと思ったので、タイトルの通り、チューリングマシンのエミュレーターを作ってみる事にしました。Haskellもまだそんなに使いこなせてないうえに、チューリングマシ…

AmaterasUMLでクラス図作成

今まで、ちょっと触った程度で「これ便利!」などと知ったふうな口をきいてたAmaterasUMLプラグインなのですが、古くなったコードを読みなおすのに便利なんじゃないかと思ったので少しだけちゃんと使ってクラス図を作ってみました。 パッケージエクスプロー…

Haskellで新しい型を定義する

そもそも、今日はderivingについて書こうと思っていたのですが、その前に型を作る段階で一つ記事が書けるレベルの内容だったので、まずはちょっとした型を定義してみる事にします。 module Main where --型 Bar を作成 newtype Bar = Bar Int deriving (Eq,R…

モナドをたしなむ

以前のエントリにてHaskellで、簡単なモナドを使って動かしたりしてみましたが、今回はもうちょっとモナドの世界に突っ込んでみようかと思います。と、思って意気揚々とvimを立ち上げたのですが、恥ずかしながらそもそも型クラスやデータ構成子をちゃんと理…

今更Dartのメソッドオーバーロード/名付きコンストラクタの話

以前から書こう書こうと思っていた内容を少し。 以下、公式サイトのArticles、diomatic Dartより。 Named constructorsLike most dynamically-typed languages, Dart doesn't support overloading. With methods, this isn't much of a limitation because y…

自作言語、最初で最後のプログラム

問題の自作言語ですが、とりあえずマルバツゲームを開発してみて、標準入出力内でひと通りの事はできるという事は解りました。 とはいえ、 そもそも右結合にしてしまった事 簡約がグダグダなのでクロージャが扱えない リストと値の扱いが曖昧なまま力技で実…

Rubyで遊ぶ

以前から面白い言語だと聞いていたので、ちょっとばかり遊んでみました。 l = (1..50).to_a l.map! do |o| o*=2 end p l 実行結果 $ ruby test10.rb [2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40, 42, 44, 46, 48, 50, 52,…

自作関数型言語その後

その後、自作言語TFLのほうも、バグを潰したり標準ライブラリを整えたり、こちらにチュートリアルを纏めたりなどとしていました。基本的に短期間で実装した言語なので、どこかでボロが出るだろうなとは思っていたのですが、とうとう今日、恐れていたことが起…

チュートリアル

ここからは、TFLの簡単なチュートリアルになります。 リファレンスやマニュアル等はいずれ書くかもしれませんが、とりあえずこんなもので勘弁してください。四則演算は、システム関数「+,-,*,/」に、値のリストを与えます。 > +[1,2,3] 6.0 > -[10,5,3] 2.0 …

【自作関数型プログラミング言語TFL】関数型言語作りました

以下の内容は古くなっています。 自作言語TFLについての最新の情報はこちらから参照してください。しばらく更新が止まっていました。先日ふと思い立って、Javaを使って簡単な関数型言語のインタプリタを作り始めたのですが、実際に始めてみるとこれが意外と…

IOモナドとdo記法

まずはじめに、HaskellでのHelloWorld。 module Main where main :: IO () main = print "Hello,World!"この"()"というのが気になったのですが、どうやらちゃんとPrelude(?)で定義されているようです。 Prelude> :i () data () = () -- Defined in GHC.Un…

モナドの入り口に立つ

Haskellを本格的に勉強しはじめて20日と少し経ち、関数型言語のイメージのようなものは大体つかめて来たと思うので、Haskellerの間で「難関」と言われている「モナド」に挑戦します。IOや、List、Maybeがモナドだ、というのはいやというほど聞かされていた…

Haskellでスタックを実装する

以前から、Haskellには副作用が無いので、スタックの実装をするにはどうすれば良いのか、という事を色々思いめぐらせたりしていたのですが、悩んでても仕方がないので調べてみたら、思いの外単純でした。大抵のサンプルでは、ちゃんと型を指定していたりする…

Dartの静的型付け

と、見出しで銘打っておいてなんですが、Dartは動的な型付けを行っています。 これは、「多くの開発者に支持されているJavaScriptの性質を維持する」というDartのコンセプトで考えれば、自然な事だと言えます。とはいえ、動的な片付けはJavaScriptが大規模な…

Dartにおける関数の動作まとめ

Dartの関数はJavaScriptと同様第一級オブジェクトです。 このへんが開発者であるGoogleさんのいう「動的な」特性になると思うので、すごく簡単に動きをまとめてみようかと思います。普通に関数定義。 bar(int x) => x*x; foo() => print("bar = ${bar(3)}");…

Googleの新言語Dart音速レポート

Googleが新言語を発表したそうです。まったく嗅ぎつけてなかったので今さっきTwitterで初めて知った所です。ざっくりと概要を纏めると、現状Webアプリの開発言語と言えばJavaScriptだが、JavaScriptは単なる言語の進化では修正できない根本的な問題をかかえ…

遅延評価についてもう少し

次の例を考えてみます。 Prelude> let foo = 1 : map (+1) foo Prelude> take 10 foo [1,2,3,4,5,6,7,8,9,10]例えば、機械的に四つ目の要素を計算する部分を書いたら次のようになりますよね。 Prelude> 1 : map (+1) [1,2,3] [1,2,3,4]五つ目はこう。 Prelud…

関数型言語に慣れる

Haskellの勉強を始めたのは、先日のエントリで書いたとおりです。それまでも、なんとなくLispを触ってみた事はあったのですが、表面を撫でた程度で終わっていたので、これでようやく関数型言語への本格的な第一歩を踏み出した事になります。今はちょうど、す…

メモリをイメージする事

少し、メモリの使われ方について考えさせられる出来事がありました。例えば、以下のソースを見て、即座に気持ち悪さを感じられるかどうかは、一つのステータスかもしれません。 public class Foo { public String getLine(int i){ return "Line - " + i; } }…

UbuntuでHaskell

なにか関数型言語を実用的なレベルまで使えるようになりたいと、常々思っていたのもあり、LispかHaskellかで迷ったのですが、対話形式での扱いやすさはHaskellのほうが強い気が(なんとなく)したので、Haskellをメインに学習していく事にしました。とりあえ…

生命モデルとオブジェクト指向

昨日、Twitterで「性行為をオブジェクト指向で表現したらどうなるか」なんていう猥談をしていました。最初はふざけ半分で適当な事を言っていたのですが、考えていたら夢中になり、わりと中身のある話になりまして… 後になってその会話を読み返してみると、こ…

GUIとイベント処理

思うところあって、今まで触ってきたプログラミング言語の、GUIアプリケーション開発におけるイベント処理の書き方をズラズラと並べてみようと思います。まずはVisualBasic5.0,6.0から。 Private Sub btnFoo_Click() '処理 End Sub VB5と言えば、自分が最初…

今更プログラミングを語る

どうも、三日坊主のちゅーんです。 今度こそブログを習慣化しようと、無駄なあがきをしています。 とりあえず、最低でも週に二回は更新しようと思います。今度こそ…さて、再会一回目の記事と致しまして、このブログの主題であるプログラミングそのものについ…