2007-06-01から1ヶ月間の記事一覧

やっぱり Gauche はすごい

OCaml のソースを吐けるようになったので、実行速度を比べてみることに。使ったのは次のソース。 (define (fib x) (if (= x 0) 0 (if (= x 1) 1 (+ (fib (- x 1)) (fib (- x 2)))))) (define main (print (fib 25))) 結果。 % ./minscheme compile f.scm % g…

名前空間

んんー?なんかおかしくね?

Scheme to Haskell はやめて、 Scheme to OCaml に

することにしました。 そもそも最初に Haskell を選んだ理由は、ネイティブコンパイラのある関数型言語という条件にあてはまったからなので。OCaml でもその条件は満たされる。さらに OCaml のコンパイラを使ったほうが生成されるコードは高速(らしい)だし、…

コンパイル

一応コンパイルができるようになった。Scheme -> Haskell と変換して、そのまんま ghc にコンパイルさせてます。 (define main (print (fact 10))) (define (fact x) (if (= x 0) 1 (* x (fact (- x 1))))) % ./minscheme compile fact.scm [1 of 1] Compili…

抽象構文木

Scheme のインタプリタ(の簡単なやつ)は、まず抽象構文木を作って、そのあと実行するという手順でやれば、IO 付きのものも結構素直に実装できると判明。特になにもしなくても、再帰呼び出しもできたし。コンパイラも作ってた( Scheme -> Haskell -> NativeCo…

ワンライナ

輪講の宿題。($) あたりがポイント。笑 applyAll funs x は、関数のリストを取ってそれを右から順に初期値に適用していく関数。 Prelude> let applyAll = flip $ foldr ($) Prelude> applyAll [(+1),(+2),(+3)] 1 7 Prelude>

Lisp インタプリタ経過報告

再帰できる。ここまで長かった。 slisp> (define fact (lambda (x) (if (= x 0) 1 (* x (fact (- x 1)))))) #<undef> slisp> fact #<subr(lambda)> slisp> (fact 10) 3628800 slisp></subr(lambda)></undef>

Scheme というか Lisp インタプリタ

作ってた。前に作ったやつは入出力ができないという悲しい作りだったんだけど、今回のやつはちゃんと入出力ができますよ。ちょっと前にもめてた数値は、とりあえず整数型だけに限定することで対応してます。そのうちなんとかしなきゃね。それと、lambda は動…

forall とか 型クラスとか

勉強会(http://www.agusa.i.is.nagoya-u.ac.jp/person/mzp/hiki/?SICP)で、S 式ネイティブコンパイラを作ろうぜ、ということだったので、id:mzp や id:suer さんに手伝ってもらってちょっと作ってみてた。 前々から一度 forall を使ってみたかったのと、数値…

OCaml で Parsec っぽく

OCaml で Parsec っぽいことをやろうとしていましたが、中途半端な状態で終わってしまいました。State モナドっぽいやつを作って、bind とか return も定義して、いくつかの基本的なパーサコンビネータと選択演算子はできたんですが、パースを失敗したときに…

Arrow の do 記法

id:syd_syd さんに教えていただいた arrow の do 記法。do 記法内でバインドした値は(おそらく) arrow の中に入れることしかできない。つまり arrow として使えない。僕はよくわかっていないんですが。 {-# OPTIONS -farrows #-} import Control.Arrow listc…

Safari3

Mac

これは入れるべきなんじゃないかと思った。出来心で Windows 版を入れてみたら超速かったので、Mac にも入れてみることに。メニューが英語だけども。 えーと、 Safari Stand のバージョンを上げないといけなかったこと以外は特に問題なし。インクリメンタル…

filterA

できた!けどめちゃくちゃだ。その場しのぎ的な感じがぷんぷんするぜー。 filterA p = arr listcase >>> arr (const []) ||| ((?x -> if p x then Left x else Right ()) *** filterA p >>> arr (uncurry cons)) cons (Left x) l = x:l cons (Right _) l = l…

mapA

Arrow での map 関数。 mapA f = arr listcase >>> arr (const []) ||| (f *** mapA f >>> arr (uncurry (:))) んぐ。気持ち悪い。常識が覆されております。map がでてきたら当然 filter も書くでしょ!とかいって適当に書いてたけど、いっこうにうまくいく…

常日頃から時間軸が違うような気がしていた

OCaml-Nagoyaな先輩の id:yoshihiro503 さんがはてダで 定理証明系Coqを使った証明をゴリゴリ書き始めたもよう。 未来日記で。 って日記を書くのが流行ってるらしいので便乗してみた。

8-QUEEN

まぁ8に限らないんですが、コンパイル時に数字が決めうちなのが悲しいです。 それと、何も考えずに実装しているので(たぶん)効率が悪いです。 import Control.Monad.State import Data.List type Coord = (Int, Int) type Queens = [Coord] -- solver num = …

論理回路

いろいろなサイトを読みながら意味もわからず書いたコード。c1 は論理回路の定義です。Arrow はモナドの一般化らしいです。やっぱりよくわかりません。とりあえず proc arg -> do ...みたいな書き方は、コンパイル時に "-farrows" を付けないと使えません。 …

しりとり

やっぱり OCaml も使えないといかんなーと思う今日このごろ。文字列の扱いが最も戸惑う。文字のリストでいいじゃんという感じ。そして Haskell には、Char できちんとユニコードが扱えることを望みます。 let rec delete e = function [] -> [] | x::xs when…

Functioal Programming IAT

記念(なんの?)にやってみる。 あなたの関数型指数は 0.639959927412297 です。正が関数型、負が手続き型です。だそうで。やっぱ関数型が好きなのか。

最大の和

http://www.ioi-jp.org/joi/2006/2007-ho-prob_and_sol/2007-ho.pdf の問題1。普通にやっても全然面白くないので、 step 関数で無駄な計算を減らすように少し工夫してみた。が、リストの末尾に要素を追加するコストを考えると毎回計算した方が速い気もする。…

マージソート

いろいろやってるときにできた副産物。無限リストでも大丈夫。 mergeSortN :: Ord a => [[a]] -> [a] mergeSortN = foldl1 mergeSort2 mergeSort2 :: Ord a => [a] -> [a] -> [a] mergeSort2 a [] = a mergeSort2 [] b = b mergeSort2 (a:aa) (b:bb) | a <= …

モビール

http://www.ioi-jp.org/joi/2006/2007-ho-prob_and_sol/2007-ho.pdf から。工夫した点は特にありません。 -- -- http://www.ioi-jp.org/joi/2006/2007-ho-prob_and_sol/2007-ho.pdf -- problem 5-3 -- import Text.ParserCombinators.Parsec import Data.Lis…

OCaml で非決定計算っぽいことをやる

OCaml で非決定計算っぽいことをやってみることに。最初は Python でやってたんだけど、if が文なことにがびーんとなって OCaml で書き直しました。amb な部分はこんな感じに。id:mzp に、これってただの継続渡しじゃんと言われたが、継続渡し・継続(call/cc…

しりとり

勉強会でのネタ。与えられた語彙を全て使ってしりとりができるかどうかを判定するもの。 shiritori は無理に StateT を使ったもの。 shiritori2 は、順列を作ったあとにしりとりができる並びのものだけを取り出すという素直な実装。 import System (getArgs)…

部分和問題

http://www.agusa.i.is.nagoya-u.ac.jp/person/mzp/hiki/?exercise#l22 から。普通。 import Data.List partial :: ([Int], Int) -> Bool partial ([], _) = False partial (xs, n) = let t = [(delete a xs, n-a) | a <- xs] in if any ((==0).snd) t then …

LCS (最長共通文字列)

http://www.agusa.i.is.nagoya-u.ac.jp/person/mzp/hiki/?exercise#l16 から。 ひねりも何もない、普通の関数。テストもろくにしてないのでもしかしたらダメかも。 lcs :: Eq a => [a] -> [a] -> [a] lcs [] _ = [] lcs _ [] = [] lcs (x:xs) ys = longer (x…

Arrow はステキ

下のやつを Arrow を使って書き直してみる。ばっちりポイントフリー。 kaibun :: Eq a => [a] -> Bool kaibun = id &&& reverse >>> (uncurry $ zipWith (==)) >>> and ようやく Arrow の使いどころを見つけたか…。いや、いちいちこんなふうに書くやつがいた…

今日の一行

http://www.agusa.i.is.nagoya-u.ac.jp/person/mzp/hiki/?exercise#l4 から。ハノイの塔を State モナドでやろうとして混乱してやる気がなくなったので、ワンライナーでお茶を濁す。できれば引数の s をなくしてしまいたい。 isKaibun s = and $ zipWith (==…

MCXI

http://d.hatena.ne.jp/mzp/20070608 である。この程度のパーシングに Parsec を使うのもなぁとは思うが、あえて使ってみる。 import Text.ParserCombinators.Parsec import Data.Char import System mcxi = do m <- try (p 'm') <|> return 0 c <- try (p '…

幅優先探索

前に(http://d.hatena.ne.jp/zyxwv/20070609)幅優先探索がどうこうと言ってましたが、これってただの concatMap じゃん。我ながら意味わかんねぇ…。