はてなブログへ引越します。

ここです Code Aquarium

モナドとかの演算子の型

(>>=) :: Monad m => m a -> (a -> m b) -> m b flip (>>=) :: Monad m => (a -> m b) -> m a -> m b (=<<) :: Monad m => (a -> m b) -> m a -> m b ap :: Monad m => m (a -> b) -> m a -> m b (<*>) :: Applicative f => f (a -> b) -> f a -> f b flip (…

逆FizzBuzz問題

オートマトンっぽい問題なのは分かるけど、それを実装するのは面倒くさいので必要と思われる長さのFizzBuzzシーケンスを切り出して全チェックしてます。 与えられた「Fizz Buzz リスト」 の長さを len とすると、解が含まれる範囲は先頭から高々「7 + (len -…

partitionしてmapする関数

こんなのあったら便利かもしれない関数。 partition したシーケンスを map で処理したいということがたまにある。それを簡略できると楽なことがたまにはあるかも。 実は欲しかったのは (mapncat 2 f coll) のパターン。 下のようなコードを書きたくて作った…

例の問題

CLの練習で適当に書いた。いったい何を訴えたいのかよくわからないコードになった。 解き方はいたって普通。 (require :alexandria) (require :cl-ppcre) (defun perms (n xs list fn) (if (zerop n) (funcall fn list) (loop for x in xs do (perms (1- n) …

ccl:*command-line-argument-list* がなんか変

● 実行形式ファイルが作りたい コマンドライン引数リストをそのまま表示するプログラム(Clozure CL) ;;; hello.lisp (defun -main () (format t "~a" ccl:*command-line-argument-list*)) (ccl:save-application "hello" :toplevel-function #'-main :prepen…

partial関数(マクロ)の続き

前回書いた partial マクロ利用例 (mapcar (partial #'args-rotate-right 1 #'make-list :initial-element 'X) '(1 2 3 4 5)) mapcar の第一引数をもう少し理解しやすい形にしたい。 そこで部分適用を段階的にしてみる。args-rotate-right 1 を部分適用した…

partial関数書いてみた

●partial関数 Common Lisp で *1 (defun partial (f &rest args) (lambda (&rest rest-args) (apply f (append args rest-args)))) (funcall (partial #'* 2) 10) ;=> 20 (funcall (partial #'list 1 2) 3 4 5) ;=> (1 2 3 4 5) 一応できてますね。左から順…

オーバーフローする flatten

エントリータイトル変更しました。 「オーバーフローしない」-->「オーバーフローする」 ●On Lisp の flatten はスタック溢れを起す (defun flatten-a (lis) (labels ((rec (x acc) (cond ((null x) acc) ((atom x) (cons x acc)) (t (rec (car x) (rec (cdr…

Clojureでもクリスマスツリーを飾りました

この記事はClojure Advent Calendar 2011の13日目の記事です。一日+α 遅れましたが。シーケンス(リスト)でクリスマスツリーが作れるらしいので作ってみました。 ●元ネタ vallog: クリスマスツリーを飾りました。Lispで。 パラメトロン計算機: クリスマス…

seq と LazyList

window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.paren…

F# の Project Euler 26 コードを改良した

昨日のエントリの続報です。 F#版改良コード 剰余シーケンス生成関数と、剰余の既出判定関数を一つにまとめました。パフォーマンスに悪影響を与えている疑惑がある 遅延シーケンス操作部分を無くすのが目的です。結果、桁違いに早くなりました。 前回 15 秒…

F# で Project Euler 26 を解いたら遅かった

問題はこれ : Problem 26 ● F# での解答 何故か遅い。うちの環境だと 15秒以上かかる。 ideone.com で試したらやはり同じくらいかかっているようで、タイムアウトでプロセスを kill されてた。 recurringLength に 再帰回数が大きくなるような引数*1を与える…

emacs lisp にも clojure の ->> が欲しいよね

試しに書いてみたんだけど、これはいいかも... (require 'cl) (defmacro my:-> (&rest exprs) (when exprs (reduce '(lambda (acc expr) (if (listp expr) (cons (car expr) (cons acc (cdr expr))) (list expr acc))) exprs))) (defmacro my:->> (&rest exp…

mutable変数はクロージャに閉包できない

F#

クロージャでかっこよく*1フィボナッチするよ! let makeFiboClosure (a, b) = let mutable t = (a, b) fun () -> let x,y = t in t <- (y, x+y); x makeFiboClosure は、クロージャを作る関数です。評価するとレキシカル変数なタプル t を更新しながら数列…

Mono用 fsharp-mode 補助スクリプト

F#アセンブリを任意のパスに配置して開発できるように補助的な elisp を書きました。A Helper of fsharp-mode (v0.3) for Mono中途半端な感じですが、F# 学習用には使えるんじゃないかと思います。 やってることは 環境変数 MONO_PATH の設定と、実行プログ…

UbuntuとEmacsでF#

意外と簡単に環境つくれました。Ubuntu は 10.04 LTS です。 ♯Monoインストール Ubuntu の apt で入れました。というか入れてありました。version は 2.10.5 なので F# 入れるには十分新しいようです。 ♯make ツール autoreconf をしたら libtoolize が無い…

F# で ProjectEuler18

F#

List メインで解こうと決めてやってみたけど無理してるのが見え見え。Seq にしてやった方がよかったかも? 筋のいいプログラマーなら文字列からのパースをもっと安全なコードにするんでしょうかね。Project Euler 18 解答 (gist) リファクタリング(2011/11/…

関数の型註釈

F#

関数定義の時に型を明示しなくても推論で型を決めてくれるけど、明示したいこともある。 例えば、** 演算子は float 型専用なので他の型では使えない。 let pow x y = x ** y pow "2" "10" //=> error FS0001: This expression was expected to have type fl…

習作:数字混じり文字列ソートをF#で

F#

まだ文法とか半分くらいしか学んでないけど、リスト操作を憶えたので今の知識でどんな風になるか腕試し。 元ネタはどう書く?.org 「数字混じり文字列ソート」 open System let takeNums cs = let rec loop cs n = match cs with | [] -> (n, []) | c::cs wh…

not-empty には ? が付かない

理由は単純。評価結果が 真/偽じゃないから。 (empty? []) ;=> true (empty? [1 2]) ;=> false (not-empty []) ;=> nil (not-empty [1 2]) ;=> [1 2] not-empty の実装を見ると (defn not-empty "If coll is empty, returns nil, else coll" {:added "1.0"} …

左から適用される合成関数

F# の >> がClojureにも欲いですね。 Clojure では関数合成は comp を使いますが、comp で作った合成関数は、右から順に適用されます。 F#の e >> f >> g >> h が、Clojure では (comp h g f e) と書かなければなりません。でも、ソースコード読むときはなる…

「数字混じりソート」さらに改

昨日のコードを更に改造。 (use '[clojure.contrib.str-utils :only (re-partition)] '[clojure.contrib.core :only (-?>)]) (defn apply-flip [f a b] (f b a)) (defn parse [s] (->> (re-partition #"\d+" s) (apply-flip concat [nil nil]) (partition 2)…

「数字混じり文字列ソートをClojureで」を改良してみた

一昨日のコードがどうも納得いかなかったので改良しました。 元ネタはどう書く?.org 「数字混じり文字列ソート」 ;; clojure 1.2.1 (use 'clojure.contrib.str-utils 'clojure.contrib.core) (defn apply-flip [f a b] (f b a)) (defn parse [s] (->> (re-p…

数字混じり文字列ソートをClojureで

面白そうな問題見付けたのでやってみた。 数字混じり文字列ソート ~ Rubyとの血みどろの闘い ~ 元は、どう書く.org のちょっと前のネタみたい。 (use 'clojure.contrib.str-utils) (defn apply-flip [f a b] (f b a)) (defn prepare [n xs] (->> xs (re-part…

無限シーケンスから組み合わせ生成

組み合わせ生成関数(無限シーケンス対応版)を作ってみました。 ;; Ver.1 (defn- combinations* [xs combs] (when-first [x xs] (let [new-combs (map (fn [c] (conj c x)), combs)] (lazy-cat new-combs (combinations* (rest xs) (concat combs new-combs…

続・エラトステネスの無限の篩

本題の前に、前回のコードを少し書き換えた*1ので、まずはそちらから。 ♯エラトステネスの無限の篩 Ver.1 アルゴリズム上の変更点は倍数リスト*2を「n を除く n の倍数」ではなく、「n^2 を初期値とする n の倍数」にしただけです。 (defn- diff-seq [s1 s2]…

エラトステネスの無限の篩

♯エラトステネスの篩とは 一般にエラトステネスの篩(ふるい)というと求める素数の上限を決めてそれ以下の整数(2以上)から素数の倍数を消すことで素数を篩い出すアルゴリズムです。詳細はwikipediaに分かり易く書かかれていますのでそちらをどうぞ。 こ…

Data.FiniteMap はもう無い

All About Monads (文字化け注意) の example4.hs が実行できない。 使われている Data.FiniteMap と、それ関連の関数が古いらしい。今は、Data.Map を使うらしい。 次のように修正したら動いた。 --- 24行目 - import Data.FiniteMap + import Data.Map ---…

プログラミングHaskellのunfoldを3言語で

プログラミングhaskell 7章の練習問題にある unfold について。 ※Haskell 標準関数 unfoldr の話ではないです。 ●まず haskellで 本で提示されてるコード unfold p h t x | p x = [] | otherwise = h x : unfold p h t (t x) わかりにくいので、パラメータの…