Haskell

タブをスペースで展開する

お題だけ拝借。cf. Gaucheクックブック - タブをスペースで展開する1文字ずつ処理する。正規表現を使ったり日本語を考慮するのはパス。 untabify :: Int -> String -> String untabify w = f "" 0 where f r _ [] = r f r p (c:cs) | '\t' == c = f (r ++ r…

String#underscore を Haskell で

cf. HaHaHa! - ハイフンで区切られた文字をキャピタライズ cf. 趣味的にっき - ハイフンで区切られた文字をキャピタライズ↑ここら辺を見て思い出したのが,Ruby on Rails (より正確には ActiveSupport)にある String#underscore。 String#underscore は大…

3引数のflip

久しぶりに時間があいたので Haskell をやってみよう,と思ったらこんなのを見つけた。haskellのある暮らし - 頭の体操:3引数flipf :: a -> b -> c -> d なる関数 f があったとして, flip31 f a c b = f a b cみたいに引数の順番を入れ替える関数をポイン…

練習問題

また間があいてしまった。たまには触らないと鈍る−−ってほどなれてるわけでもないけど−−ので,練習問題をやってみる。「ISBN:4797336021:title」,p.191 から。 標準入力から読み込んだ各行を幅60バイトに納まるように折り返すコマンド, foldを書きなさい。…

concatMap

下のエントリの fold,「ふつケル」の解答例を見たら concatMap を使っていた。なるほど。 Prelude> :t concatMap concatMap :: (a -> [b]) -> [a] -> [b] Prelude> concatMap (replicate 3) "abc" "aaabbbccc"

BrainF*ckインタプリタを作る(4)

今日で最後だ。のこりの命令「[」と「]」を実装した。 「[」と「]」を実装するには命令の列を行ったり来たりできなきゃいけない。はじめに考えたのは BrainF_ck と同じように,命令のリストと現在位置を示すポインタを持ったデータ型を定義することだった。 …

BrainF*ckインタプリタを作る(3)

入出力の命令「.」と「,」を実装した。 最初,よく考えもせずに出力する関数 bfPrint をこうした。 bfPrint bf = print $ bfValue bf確かにこれでこの関数自体はちゃんと動く。つまり1文字出力される。 *Main> bfPrint $ bfIncrement bfInitial Loading pac…

BrainF*ckインタプリタを作る

Wkikipediaの記事を読んだり,ダウンロードしたインタプリタをいじってるうちに,なんかちょっとできそうな気がしてきた。 目標は Hello world プログラムの実行だ。 まず,データを格納する配列(レジスタと呼ぶことにしよう)とポインタが必要だな。 data …

BrainF*ckインタプリタを作る(2)

今のままじゃテストするもの面倒なので,外部のファイルからプログラムを読み込めるようにした。 といっても手抜きで,命令列を頭から一直線に実行して無くなったら終わり。で,最後の状態を表示する。今のところはジャンプしたりはできないんだからこれでい…

キミならどう書く 2.0 - ROUND 3 -

cf. キミならどう書く 2.0 - ROUND 3 -前のエントリでは話がBrainf*ck(一応伏せ字にする)にいっちゃったけど,こっちが本題。 まったくもって乗り遅れたけど書いてみた。 import System showStar :: Int -> IO () showStar n = do putStrLn $ (show n) ++ …

本物のプログラマはHaskellを使う

第2回が掲載されている。 けど ITproって会員にならないと記事一覧が見られないらしい。 せっかくだからこのエントリにリンクを作っておこう。 第1回 関数型プログラミングの世界へようこそ 第2回 多相型(ポリモーフィズム)への理解を深める 第3回 map…

用語の日英対応

『本物のプログラマはhaskellを使う』にでてきた用語の日英対応表をつくってみた。 こういうのは憶えておくと役に立つ,かも。 lazy evaluation 遅延評価,怠惰評価 functional programming 関数型プログラミング logic programming 論理型プログラミング pr…

引数の順序

cf. 結城浩のHaskell日記 - type宣言とりとめもない話なんだけど。 エントリのなかに isPrefixOf という関数がでてくる。 xs `isPrefixOf` ysは文字列 xs が ys のプレフィックスである時に True を返すんだけど,この xs と ys の順序について。 上のように…

『ふつうのHaskellプログラミング』

夕べ帰ったらAmazon.co.jpから届いていた。ふつうのHaskellプログラミング ふつうのプログラマのための関数型言語入門作者: 青木峰郎,山下伸夫出版社/メーカー: ソフトバンククリエイティブ発売日: 2006/06/01メディア: 単行本購入: 25人 クリック: 314回こ…

Haskellグループに参加

結城浩のHaskell日記にコメントをつけようとしたら,グループに参加しろと(はてなが)言うので参加してみた。 せっかくなので Haskellリング にも参加。 みなさん,よろしくお願いします。

高階関数版 filter'

下のエントリは前段でこっちが本題。id:hyukiさんとこにコメントをつけたんだけど,忘れないようにこっちにも書いておく。 filter' f xs = foldr (\m n -> if f m then m:n else n) [] xs結果。 *Main> take 50 $ filter' odd [1..] [1,3,5,7,9,11,13,15,17,…

major

リスト中に,関数 f(述語って言うの?)を満たす要素のほうが多ければ True をかえす,というのを考えた。all と any の中間みたいなもの。 major f xs = (length $ filter f xs) > (length $ filter (not . f) xs)結果。 *Main> major odd [1..5] True *Ma…

レコード

レコードは代数的でないデータ型。C の構造体のようなもの。うまい例を思いつかないから,本に載ってるのをそのまま書くとこんな感じ。 data Point = Pt {x :: Integer, y :: Integer}x,y をフィールドといい,それぞれ Integer 型の値を取る。具体的に値を…

型シノニムと新しい型

型シノニム(type synonym)とは,既存のデータ型に別名をつけるというもの。String が [Char] であるのがよい例。 型シノニムを宣言するには type 宣言を使う。 type String = [Char] newtype 宣言は「新しい型」を宣言する。type 宣言と data 宣言の中間的…

パスカルの三角形(みたび)

cf. id:rubyco:20060531:pascal cf. id:epics:20060530:1149000099Ruby の Enumerable#inject は Haskell では foldl だ。 というわけで早速やってみよう。ただし,無限リストを扱えるように foldr をつかう。早くしないと 結城さんに先を越されちゃうぞ。 p…

data宣言に型変数をつかう

データ構成子の引数は具体的な型じゃなくて型変数でもかまわない。 data Cream a b c = Eric a | Jack b | Ginger c deriving (Show) *Main> [Eric 10, Ginger 'g', Jack 2.4] [Eric 10,Ginger 'g',Jack 2.4] *Main> [Eric 1.2, Ginger 3, Jack "2.4"] [Eric…

deriving修飾子

新しく宣言した型を何らかの型クラスのインスタンスとして宣言するには,instance 宣言を使う。が,いくつかの型クラスに関してはもっと簡単な方法がある。data 宣言と一緒に deriving 修飾子を使うのがそれ。 次のようにすると,Cream 型を宣言すると同時に…

練習問題

「入門Haskell―はじめて学ぶ関数型言語」 p.101 より。 ところで,あるリストに複数の型を含めたい場合にはどうしたらいいか,という話ですが,そういう場合にも data は便利です。たとえば次のように data MyType = I Int | F Float | C Char ここでたとえ…

代数的データ型の宣言

data宣言を使って,新しい型を宣言することができる。こんな感じだ。 data Cream = Eric | Jack | Gingerdata に続いて型のなまえ,= の右側には取りうる値を | で区切って列挙する。値は大文字で始まる必要があり,データ構成子(data constructor)という…

データ構成子が重複すると

エラーになる。たとえば data Cream = Eric Int | Jack Int | Ginger data Guiterist = Eric | Bill | Frank | Jeffこれを ghci に読み込むと *Main> :l datatype.hs Compiling Main ( datatype.hs, interpreted ) datatype.hs:3:17: Multiple declarations …

Newton法で平方根をもとめる

cf. http://hpcgi2.nifty.com/1to100pen/wiki/wiki.cgi?p=%CB%E8%C6%FCHaskell 2006-05-21 最近流行りの SICP の 1.1.7 Newton法からお題を拝借。 おわっと,流行だったのか。もしかして乗り遅れた? 上の [1..100]>>=pen さんのもそうだし,hasko さんとこ…

モナドについていろいろ

http://www.city5.org/rhg_200605/index.html 「入門Haskell―はじめて学ぶ関数型言語」の著者・向井さんによるRHG読書会での資料。

Haskellプログラマ進化論

えーと,どこで見つけたかわかんなくなっちゃったけど。The Evolution of a Haskell Programmer階乗を求める fac 関数にこんなに書き方があるなんて。 俺はさしずめ Another senior Haskell programmer あたりかな。まだまだ先は遠いな。Interpretive Haskel…

練習問題

「入門Haskell―はじめて学ぶ関数型言語」 p.86 より。昨日より1ページ戻ったけど。 (1) repeat,cycle,iterate をそれぞれ自分で定義しなさい。 これは簡単。再帰を使ってこうだ。 myRepeat a = a:map id (myRepeat a) myCycle a = a ++ myCycle a myItera…

原始的なピタゴラス数(こんどこそ)

cf. id:takatoh:20060519:pythagorean 昨日のダメダメなのを修正するぞ。 いや,実はアップしてからすぐに気が付いたんだけど時間がないから後にしよう,なんて考えたら,案の定ツッコまれた。 というかアップする前に気づけ。 というわけで,昨日のでは条件…