2006-05-01から1ヶ月間の記事一覧

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

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 昨日のダメダメなのを修正するぞ。 いや,実はアップしてからすぐに気が付いたんだけど時間がないから後にしよう,なんて考えたら,案の定ツッコまれた。 というかアップする前に気づけ。 というわけで,昨日のでは条件…

練習問題

「入門Haskell―はじめて学ぶ関数型言語」 p.87 より。 lattice 関数を改良し,現在の2次元格子点限定から任意のn次元格子点に対応するように Integer -> Integer -> [ [Integer] ] の型 を持つようにしなさい。また,それを利用して all_lattice も n次元格…

リスト内包表記と無限リスト

(i,j) の無限リストを得ようとして,素朴にこんな風にやっても期待通りにはいかない。 Prelude> [(i,j) | i <- [0..], j <- [0..]] [(0,0),(0,1),(0,2),(0,3),(0,4),(0,5),(0,6),(0,7),(0,8),(0,9),(0,10),(0,11),(0,12 ),(0,13),(0,14),(0,15),(0,16),(0,17…

原始的なピタゴラス数

互いに素である3数からなるピタゴラス数を原始的な(または素な)ピタゴラス数というらしい。 cf. http://ja.wikipedia.org/wiki/%E3%83%94%E3%82%BF%E3%82%B4%E3%83%A9%E3%82%B9%E6%95%B0これには公式があって,内包表記で次のように書ける。公式について…

リスト内包表記

リストを作るとき,要素を列挙したり範囲を指定するほかに,計算をしながら作ることもできる。 たとえば100以下の偶数のリストは *Main> [x | x <- [1..100], x `mod` 2 == 0] [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,…

foldr と無限リスト

昨日の IO () さんのコメントから。 cf. id:takatoh:20060514:myInits えーと,つまり foldl は無限リストを扱えないけど, foldr は扱えるってことだな。foldl を使った版の myInits がダメだったのは last じゃなくて foldl のせいだってことだ。 それより…

myUnlines と myUnlines2

昨日の IO () さんからの宿題の回答。といっても myInits と myTails のほうはまだ解決してない。とりあえずわかったのから。 cf. id:takatoh:20060513:exercise2 まずは myUnlines を1行で書くことから。これはリストの最後に空文字列をつけてやればいい。…

myInits (と myTails)

IO () さんから無限リストに対応できてない,と指摘を受けた myInits。これもできたと思う。 cf. id:takatoh:20060513:exercise 昨日のは length を使って結果のリストの長さを決めてしまったのがいけなかった。これじゃ無限リストには対応できない。で,は…

パスカルの三角形

もう一つ思いついた。といっても「次の行」を作るところは一緒なんだけど。 cf. id:takatoh:20060512:pascal (コメント欄も参照) pascalTriangle = iterate (\xs -> zipWith (+) (0:xs) (xs ++ [0])) [1] takeAndPut n = (((putStr . unlines) . map show)…

練習問題

「入門Haskell―はじめて学ぶ関数型言語」 p.78 より。 (1) filter,inits,tails,zip,zipWith を定義しなさい。 myFilter f [] = [] myFilter f (x:xs) | f x = x:myFilter f xs | otherwise = myFilter f xs myInits [] = [] myInits xs = map ((flip tak…

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

サポートページができた。発売日(正確には配本)は5月31日だそう。

練習問題(つづき)

「入門Haskell―はじめて学ぶ関数型言語」 p.78 より。 (3) unlines,unwords を intersperse を使って定義しなさい。また使わずに定義しなさい。 まずは使う方から。 myUnlines = (concat . intersperse "\n") myUnwords = (concat . intersperse " ")結果。…

両替の組み合わせは?

id:a-san さんの両替するのに何通りあるか?に刺激されて,両替の組み合わせを列挙する enumChange をつくってみた。Maybe の扱いでちょっと苦労したよ。 cf. http://d.hatena.ne.jp/a-san/20060508#p1 enumChange coins amount = map peel (cc amount 0) wh…

パスカルの三角形

id:hyuki さんのを見て。 cf. http://sicp.g.hatena.ne.jp/hyuki/20060512/pascal といっても Scheme はよくわからんので Ruby版(id:rubyco:20060429:pascal)を見ながら書いた。 combination n k | k == 1 = 1 | k == n = 1 | otherwise = (combination (n…

練習問題

「入門Haskell―はじめて学ぶ関数型言語」 p.73 より。 ①は面倒なだけなのでパス。 ②foldr の定義を書きなさい。 foldr は後ろから引数の関数を適用するんだからこうだろう myFoldr f a x:[] = f x a myFoldr f a (x:xs) = f x (myFoldr f a xs)実行。 *Main>…

関数の合成

2つの関数を f と g とすれば f . g と単純に行くのは g の引数が1つの場合だけ。2つ以上の引数をとる場合にはちょっと複雑になる。次のような関数で確かめてみる。 f a = a:[] g a = a:[] g2 a b = a:b:[] g3 a b c = a:b:c:[]まずは簡単な f と g *Main…

練習問題

今日は目先を変えて練習問題をやろう。 「入門Haskell―はじめて学ぶ関数型言語」 p.72 より。 ①前ページの実装から,takeとdropに大きな値や負の値が入った場合の対処をしなさい。 前ページの実装とはこれ。Prelude の関数とかぶってはいけないので名前は変…

ポイントフリースタイル

今日の一行 - ポイントフリースタイルを参考にして mytake から引数を消してみる。 mytake n xs = fst $ mysplitAt n xs ↓ mytake n xs = fst (mysplitAt n xs) ↓ 関数合成を使って xs を外に追い出す mytake n xs = (fst . (mysplitAt n)) xs ↓ xs を消す m…

スーパークラス/サブクラス

今日もメモ程度。 値の大小関係を表すには Ord クラス。「入門Haskell」によればOrd クラスの定義は次のようである,らしい。 class Eq a => Ord a where (>) :: a -> a -> Bool (<) :: a -> a -> Bool (>=) :: a -> a -> Bool (<=) :: a -> a -> Bool compa…

型クラス

昨日(id:takatoh:20060506:type)の最後にあげた関数の型 Prelude> :type map (\x -> x * 2) map (\x -> x * 2) :: (Num a) => [a] -> [a]の中に現れる (Num a) => という部分は,a が Num クラスのインスタンスでなければならないことを表している。つまり…