Haskell

純粋関数的 Haskell I/O プログラミング

HaskellはIOモナドを使えるので 626809">命令的Haskellプログラミングが可能になっているのだが,その代償としてプログラム全体の型は自明なIO ()に潰れてしまう.プログラム全体の型が潰れないような仕組みを考えたのが ell.org/package/oi">oiパッケージ.…

命令的 Haskell プログラミング

めいっぱい imperative に書いてやったぜ :p やってることはそれほど自明ではないのに、main :: IO () って型には何の情報もないなぁ。IO () なんて自明な型に潰れやがって。。。 module Main where import Control.Concurrent import System.Environment ma…

Purely Functional Lazy I/O についてまだ考えている

HaskellのI/O方式は以下のように変化している. Dialogue Handle-based Monadic I/O Iteratee-based (Monadic) I/O 1.から2.へはImperative functional Programmingを 2.から3.へはIncremental multi-level input processing and collection enumerationを読…

darcs pull が遅い件

darcs pullが遅すぎて作業にならなくなった.なんとなくではあるが, 時間的に古いパッチ列の間に時間的に新しいパッチ(基本的にconflictを解消するためのパッチ)をはさむ. darcs unread というのがパフォーマンスに悪影響を与えている気がする.とりあえ…

darcsリポジトリの最適化方法を教えて君

いままで比較的小規模のプロジェクトでしかdarcsを使っていなかったので,そのパフォーマンスはそれほど気にならなかった.最近,あるプロジェクトから,1年以上前にフォークしたプロジェクトに関わるようになって,darcsのパフォーマンスがすこし気になっ…

xmonad

毎年恒例(だったかな)三日坊主の初日 gnome+xmonadという日和見気味の環境から単独xmonadという漢の環境(ほんとか?)へ移行をもくろむ. インストールメモ(以下のメモは私個人の環境に依存しています.) 準備 各種ライブラリ,ヘッダファイルのインス…

Purely Functional Lazy IO

ほんもののプログラマや浮世プログラマ(Real World Programmer)には評判の悪い「純粋に関数的で怠惰な入出力」ですが,私のような浮世離れの怠惰プログラマにはこの上なく魅力的に見えます.リソースも実行順序も考えない世界に逃避するための仕組みをつく…

関数型言語について議論するときの用語集(未完)

プログラミング言語やプログラミングパラダイムについて議論するとき,用語の定義を共有しないと議論が噛み合わなくなります.それで以下に私が日頃関数型言語について議論したり考えたりするときに暗黙で使っている定義(ここでは厳密なものではなく,この…

BuzzFib

ナイーブ.ちょっと書き換えた.FibBuzzだとおもったら、BuzzFibというらしい。 module Main where import Data.List import System.Environment buzzfib :: [String] buzzfib = "FibBuzz" : unfoldr phi (1,1,1,tail $ cycle $ take 5 $"Buzz":repeat "") w…

tailDropWhile

複数行からなるテキストデータを処理するとき,行末の空白を除去したいときがある. rmTailSpaces :: String -> String rmTailSpaces = unlines . map chop . lines 1行分の文字列を末尾の空白を取り除いた文字列に変換する関数chopの実装を考えてみよう.素…

Haskellerのための命令プログラミング用語講座

本記事が読者として想定しているのは純粋非正格静的型付けプログラミングしかできない純粋培養ハスケラ(Haskeller)のみなさんです.だれがなんといおうとマイノリティである純粋培養ハスケラは,だれがなんといおうとマジョリティであるシャー(C er),プ…

とある使い捨てコード

module Main where main :: IO () main = interact ruby ruby :: String -> String ruby "" = "" ruby s = case break ('('==) s of (_,[]) -> s (xs,_:ys) -> "<ruby><rb>"++xs++"</rb><rp>(</rp><rt>" ++ case break (')'==) ys of (_,[]) -> error $ "invalid input: "++s (ys',_:zs) </rt></ruby>…

R(n)の列挙

冪集合 - Life Goes Onに美しいコード。リスト内包表記の使い方も素敵。

1to100penさんのヒントにより書いたもの

data List = Nil | List ::: List を使った. Python 読めないので,Pythonの解と同じかどうかは良くわからない. data List = Nil | List ::: List r :: Int -> List r 0 = Nil r n = powerset (r (n-1)) powerset :: List -> List powerset Nil = Nil ::: …

R(n)列挙

て日々(6月1日)にあった問題.すこし考えたんだけど綺麗には書けず.ぐちゃぐちゃ.Natクラスのメソッドにしたり,禁断の unsafeCoerce を使ってしまった.R(5)はちょっと長すぎるのでR(3)とR(4)を表示. ghci> pprR three "{0,{0},{{0}},{0,{0}}}" ghci> pp…

プログラムの書き方を忘れる

4月はコードを書かなかった.すっかりコードの書き方を忘れてる.orz

自然数対の整列列挙

であるようなが与えられとき,を満す自然数対をで変換したときの大きさの順にならべたリストを生成するプログラムを書け [id:route150:20110501#1304207462]に綺麗な解が.それをすこしアレンジして写経した. enumerate :: (Integral a, Ord b) => ((a,a) -…

Type Family (型族)

型族って何?と聞かれたんだけど上手く説明できない.どんなときに便利なの?と聞かれたんだけどそれはHaskell WiKi読めってことで. で,まぁ無益なプログラムなら,以下のような型だけがあって実体のない(上手い表現を思いつかない)プログラムの例を書け…

割り算を使わない篩

割り算は使ってないけど,sieve のやっている比較が試し割に相当している?(変更)名前を整理 module Prime (primes,primes') where import Data.List primes :: [Integer] primes = concat primes' primes' :: [[Integer]] primes' = [2]:[3]:map fst (itera…

両替問題(末尾再帰版)

硬貨の種類を順に増やすというボトムアップを行うシンプルなもの. module CountChange where type Amount = Int type Coins = [Int] jpy :: Coins jpy = [1,5,10,50,100,500,1000,2000,5000,10000] cc :: Coins -> Amount -> Integer cc cs a = foldl f (1:…

ディレクトリ階層を平たくする

私のワーキングディレクトリは ~/work/2010/12/30/ のように日付による階層になっている. 過去1ヶ月とか過去1年のファイルを一覧したいことがあるので,階層を平たくするスクリプトをでっちあげた. module Main where import Control.Applicative import D…

「再帰のこころ」「反復のこころ」そして「メモ化」少々

「n個の対応する括弧のパターン」(http://d.hatena.ne.jp/ymotongpoo/20101209/1291879286)についてあれこれを徒然に考えてみました. 再帰で考える まずはパターン数を数えることにしましょう.この手の問題はまずは再帰で考えるのが基本です.m個のカッ…

HIMA' のための Darcs 資料

HIMA' のための Git 資料 - あどけない話にならって. 用意すべきもの: darcs Haskell漢なら,cabalコマンドを使ってインストール.簡単に手にいれるなら,コンパイル済みバイナリが http://wiki.darcs.net/Binaries あたりを探ればあります. ビジュアライ…

括弧ゴルフ

本当にLispはカッコが多い? - 八発白中 Haskellは基本的には常に括弧なしでいけそうだねぇ. import System.Environment main = mapM_ putStrLn . map ppr . f . read . g =<< getArgs f n = take n $ s zip fs $ enumFrom 1 g args = if null args then "1…

途中脱出のある反復計算

そのまえに もとネタは[id:Dekosuke:20100810]「breakのあるfor文をHaskellで書きなおす」という記事です.この記事に対して,直感的に[id:nobsun:20100118]の双方向畳み込みfoldで汎用的に表現できる」と思って,コメントを付けました.ところが,その後が…

Haskell≠現場言語って?

(元ネタはSoftwareDesign誌の9月号掲載の小飼弾さんのコラムです)Haskellは儂にとっては現場言語だけどなにか? catごとき(というとcatに失礼だよなぁ),スクリプトを書くというのがすでに現場思考じゃないと思うけどなぁ.cat相当の機能を使いたければcatコ…

「変数の初期化」「変数の再代入禁止」

プログラミング言語のHaskellを説明するとき,説明の相手がCプログラマであれば,その人が知っているであろう概念を使って説明する方がわかりやすい.と考える心情はわからないわけではない. Haskellでは変数の初期化は一度しかできない Haskellでは変数は…

関数プログラミングの楽しみ

"The Fun of Programming" を翻訳しました.来週,出ます. 関数プログラミングの楽しみ作者: Jeremy Gibbons and Oege de Moor,山下伸夫出版社/メーカー: オーム社発売日: 2010/06/23メディア: 単行本(ソフトカバー)購入: 3人 …

行列

L'eclat des jours(2010-05-28)命令プログラマにとっては行列は2次元配列なので,インデックスを使って要素にアクセスしようとするのは自然です.Haskellのように行列をリストのリストで表現すると,何だかアクセスが面倒な気がするのもうなずけます.(!!)を…

発表資料

Haskellers Meeting 2010 Spring で発表したスライドを以下のように公開しました。 もう1つの外界との対話の表現 Another Expression for Interaction with Outside World プログラムコードについてはSanta Claus problem - HaHaHa!をどうぞ

Santa Claus problem

{-# LANGUAGE TypeOperators #-} import Data.List import Data.Pseudo (Pseudo, (:->),randomDelayList,merger,probe,embedPseudo) data Colleague = Elf Int | Reindeer Int deriving (Eq,Show) elf :: Int -> [Colleague] -> [Colleague] elf n (x:xs) = …

Arrowのインスタンス

関数の型構成子とKleisliトリプル以外にArrowのインスタンスで一般的なものって?

命令語訳抜きで関数型語を教えられるか

和訳抜きで英語は教えられるかを読んでふと思った。

双方向畳み込み

双方向の畳み込みというのを考えてみた. a ┏━━┓ a' ┏━━┓ ┏━━┓ a'' → ┃ ┃ → ┃ ┃ → … → ┃ ┃ → ← ┃ ┃ ← ┃ ┃ ← … ← ┃ ┃ ← c''┗━━┛ c' ┗━━┛ ┗━━┛ cコードは fold :: ((a,c) -> b -> (a,c)) -> (a,c) -> [b] -> (a,c) fold f (a,c) (x:xs) = (a'',c'') where (a''…

2010

http://parametron.blogspot.com/2010/01/2010.html リスト内包表記の練習みたいなコード module Main where import Data.Char import Data.Function import Data.List import System.Environment data Term = Val Char | App Char Term Term ops4 :: [Char]…

ソート

inspired by http://d.hatena.ne.jp/yamamucho/20100110/1263082701 import Data.List --挿入ソート ins :: Ord a => [a] -> [a] ins = foldl f [] where f s x = case span (x>) s of (t,u) -> t++x:u --選択ソート sel :: Ord a => [a] -> [a] sel = rever…

蓄積しつつ,畳み込む.

foldL :: (a -> b -> c -> c) -> c -> (a -> b -> a) -> a -> [b] -> c foldL f c g a (x:xs) = f a x (foldList f c g (g a x) xs) foldL _ c _ _ _ = c 先日のtakeWhileAcc は foldL のインスタンス. takeWhileAcc :: (a -> b -> Bool) -> (a -> b -> a) …

takeWhileAcc

リストの要素を先頭から見て,特定の条件を満すあいだだけ,要素をとりだしたいとき,takeWhileを使う.条件をすこし一般化して,先頭からの畳み込み値にも依存するようにしたいことが結構あるような気がする.というわけで、takeWhileAccを定義してみた. t…

副作用(side-effect)をめぐって

Haskellプログラミングを始めようとしているプログラマに「Haskellには副作用があるのか」という質問をされると,「ある」と答えるHaskellerと「ない」と答えるHaskellerがいるらしい(私は「ない」と答える派).これでは,「いったいどっちが本当?」とい…

HIMA3 開催のご案内

第3回 HIMA(Haskell Internet Meeting Anytime)を12月13日(日) 19:00〜22:00 に開催いたします.HIMAはHaskellプログラミングに興味をもつ人が,とりとめなく,おしゃべりをするという会です.一応のお題はありますが,Haskellの知識経験の有無深浅にかかわ…

const をめぐるあれこれ

Prelude には,const :: a -> b -> a という関数が定義されています.a -> b -> a という型は a -> (b -> a) のことなので,この関数を引数に適用すると,b -> a という型の関数になります.できあがった関数はどのような値 v :: b に適用しても,この関数を…

Haskellで「ものまねどり Mocking Bird」

自己言及がはいるとHaskellでは型付けができないので,無理かなとおもったら,unsafeCoerceという邪悪なものを使う方法があるそうです.これで,いろいろ遊べそう. module Birds where import Control.Applicative import Unsafe.Coerce -- Haskellで定義済…

アナグラム

Haskellらしさってなんだろうということを考えつつ,[id:yard:20091104]にある課題を解くプログラムを考える過程を記録してみた.整理していないのでとりとめがないです. 単語辞書から相互にアナグラムになっている単語を集める. アナグラムとは,(意味の…

ちょっとしたプログラミング

[id:yarb:20091109]にちょっとしたお題があったので,頭のなかを晒してみよう. 2乗した結果に1から9までの数字が1度ずつ現れる整数をすべて挙げよ まぁ素朴に1から100,000までの数字をチェックしよう. sortを使うからData.ListをインポートすればOKかな. …

Programming in Haskell

こちらの翻訳本もいよいよでますね.プログラミングHaskell作者: Graham Hutton,山本和彦出版社/メーカー: オーム社発売日: 2009/11/11メディア: 単行本(ソフトカバー)購入: 14人 クリック: 503回この商品を含むブログ (115件) を見る

とりあえず,チュートリアル. % cabal install happs-tutorialとりあえずローカルで見ることできるようにする. % cd ~/work % tar xvf ~/.cabal/packages/hakcage.haskell.org/happs-tutorial/0.9.0/happs-tutorial-0.9.0.tar.gz % cd happs-tutorial-0.9.…

できてきた

すこし薄くなったかな. Real World Haskell―実戦で学ぶ関数型言語プログラミング作者: Bryan O'Sullivan,John Goerzen,Don Stewart,山下伸夫,伊東勝利,株式会社タイムインターメディア出版社/メーカー: オライリージャパン発売日: 2009/10/26メディア: 大型…

O'Reilly Japan - Real World Haskell

第一報です :) 楽しんでいただければ幸いです。(10/17 追記) アマゾンにも出たようです。 Real World Haskell―実戦で学ぶ関数型言語プログラミング作者: Bryan O'Sullivan,John Goerzen,Don Stewart,山下伸夫,伊東勝利,株式会社タイムインターメディア出版社…

大文字・小文字の反転(その2)

[id:mzp:20090804#maybe]Maybeで繋げるなら,こんな感じかな. import Control.Monad import Data.Char import Data.Maybe affect :: (MonadPlus m, Eq a) => (a -> a) -> a -> m a f `affect` x = if fx == x then mzero else return fx where fx = f x inv…

大文字・小文字の反転(その1)

[id:mzp:20090804#invert]変換関数を直接作るなら,こんな感じかな. import Control.Arrow lowers = ['a'..'z'] uppers = ['A'..'Z'] exFun :: Eq a => (a,b) -> (a -> b) -> a -> b exFun (x,y) f x' = if x == x' then y else f x' invertChar :: Char ->…