Haskell

練習問題

「入門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 クラスのインスタンスでなければならないことを表している。つまり…

関数の型

連休前は仕事がつまってこのblogの更新もままならないほどのGW進行だったというのに,いざ休みになってみると一転,だらけモードで逆の意味でGW進行になってしまった。なんてこった。 気を取り直していこう。まずはこの間(id:takatoh:20060429:tr)はまった…

詳解・id:nobsunさん版 tr

ちょっと大げさか。cf. OSS WEB|ossz|oneline|2006-04-28 tr :: [Char] -> [Char] -> (String -> String) tr set1 set2 = map trans where trans = foldl (flip $ uncurry add) id (zip set1 set2) add k v s q | k == q = v | otherwise = s qこれがちゃん…

tr

tr コマンドもどき。文字列中の文字を置き換える。 import Data.List tr _ _ [] = [] tr str1 str2 (c:cs) = (tr' str1 str2 c):(tr str1 str2 cs) where tr' str1 str2 c = case (elemIndex c str1) of Just n -> str2 !! n Nothing -> cキモは elemIndex …

インデントスタイル(またはレイアウトシステム)

「入門Haskell」ではインデントスタイルについては,必要なときにその都度,といった感じでまとまった説明がなかった。 moiの頭の中 - 3.5 Functions(その3) Haskellはコードを構築するのに「レイアウト」と呼ばれるシステムを用いる(プログラミング言語Pyt…

入出力と do 記法

プログラムと言うからには入力と出力を扱えなきゃいけない。でないと何の役にも立たないからな。 ただ,純粋関数型言語の Haskell にとってはこの入出力というのは特殊なもののようだ。 入出力は手続き的にならざるを得ない。なぜなら出力が入力よりも先に行…

uniq

入出力の練習(その2)。 import System main = do args <- getArgs mapM_ uniqFile args uniqFile fileName = do contents <- readFile fileName putStr $ unlines $ uniq $ lines contents uniq [] = [] uniq (c:cs) = uniq' c cs where uniq' str [] = […

cat

入出力の練習。ファイルの内容を表示する。 import System main = do args <- getArgs mapM_ catFile args catFile fileName = do contents <- readFile fileName putStr $ contentsコンパイルして実行。 >cat sample.txt FORTRAN AWK sed C++ Perl Ruby Jav…

練習問題

「入門Haskell―はじめて学ぶ関数型言語」 p.33 より。 wordScan 利用版の wordsCount で,同じように `〜' を1単語と見なす拡張を追加しなさい。またその際,wordScan を積極的に利用すること。 これはめんどくさかった。 まずは`〜'に対応していない wordS…

高階関数とカリー化

map,zip,zipWith などのように引数に関数をとる関数を高階関数という。 まぁ,すでに今までにもずいぶん使ってるんだけど。 ちょっと練習。chrOr,chrAnd は '1' または '0' を2つ引数にとってビット演算もどきをする。 zipWith と組み合わせれば文字列の…

フィボナッチ数列

cf. id:pylet:20060416 最近のトレンドとしては、やっぱりHello, Woldの次はフィボナッチ数列ですよね(!?) そうそう,フィボナッチ数列だよ。Haskell なら1行で書ける……って,本に書いてあったものを自慢しても仕方がないので,それを見る前に自分で書いた…

フィボナッチ数列(つづき)

id:nobsun さんからコメントをもらった。ありがとうございます。 fib n = fibIter 1 1 n where fibIter a b 0 = a fibIter a b n = fibIter b (a+b) (n-1)(※ちょっと変えました) *Main> map fib [1..10] [1,2,3,5,8,13,21,34,55,89]id:nobsun さんはこれ(…