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

詳解・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 さんはこれ(…

練習問題(つづき)

「入門Haskell」のp.31から二つ目。 ② 単語のカウント方法として,`Theory of Everything'のようにバッククォートとシングルクォートで囲まれたパートを,1つの単語として表現するように wordsCount を拡張しなさい。 オリジナルの wordsCount。 wordsCount…

練習問題

「入門Haskell」のp.31から。まずは一つ目。linesCountの拡張 ① linesCountでは,空白行が続く場合にどんどんカウントしてきます。これを空白行(何もない行)を無視するように拡張しなさい。 オリジナルのlinesCount。 linesCount [] = 0 linesCount ('\n':…

偶数のリストいろいろ

定義。 even1 = [2,4..] even2 = filter (\x -> x `mod` 2 == 0) [1..] even3 = filter (\x -> x `mod` 2 /= 1) [1..] even4 = zipWith (+) [1..] [1..] even5 = map (\x -> x * 2) [1..] even6 = 2:(map (2+) even6) even7 = map (\x -> sum $ replicate x …

リストを操作する関数(その3)

foldl と foldr はちょっとわかりにくい。なのでこんなのを書いてみた。 括弧内の数字は引数を表している。0 が初期値で 1, 2, 3... がリストの各要素。内側の括弧から順に評価される。 foldl はこう。 *Main> foldl (\x y -> "(" ++ x ++ "," ++ y ++ ")" )…

ガード節

パターンマッチングの後,引数の具体的な値を条件に分岐したい場合には次のように書く。 と = の間の分岐条件の部分をガード節という。 条件は上から順にチェックされる,でいいのかな。otherwise は「その他の場合」。 swapCase は文字列の中の大文字と小文…

局所的な定義と where 節

ある関数の内部で別の関数が評価されるとき,もしその内部の関数がプログラムのほかのどの部分でも評価されないなら−−言い換えればその場でしか使われないなら,その関数を局所的な定義にすることができる。局所的に定義された関数はプログラムのほかの部分…

capitalizE

Capitalize ならぬ capitalizE。字面どおり最後の文字だけを大文字に変える。 ……いや,名前はともかく(っていうか,こんな動作に名前がついてるとは思えないが)。 toUpper や toLower を使うには Data.Char モジュールを import する。 import Data.Char c…

join

要素と要素の間ごとに新しい要素を挟み込む。 join s [] = [] join s (c:cs) = c:s:(join s cs)実行結果。 *Main> join '-' "abc" "a-b-c-"あれ? そうか,一番最後の要素も c:cs にマッチングしてるんだな。てことは”最後の要素”を表すパターンがあればいい…

関数の定義とパターンマッチング

「入門Haskell」から文字列の文字数を数える関数。 bytesCount [] = 0 bytesCount (c:cs) = 1 + bytesCount cs関数名 bytesCount につづく引数の部分がパターンを表していて,受け取った引数のパターンによって関数本体の内容が変わる。 1行目の [] は空の…

href

via. http://d.hatena.ne.jp/nskj77/20060401コマンドラインから使えるリファレンス。Refe の Haskell 版。バージョンは 0.3.1。http://i.loveruby.net/w/href.html インストールは README.jp に書いてあるとおりにすれば簡単……とはいかない。Windows だから…

リストを操作する関数(その2)

zip は2つのリストからそれぞれの要素を取り出して,タプル(組)にしたリストを返す。 Prelude> zip [1,2,3] "abc" [(1,'a'),(2,'b'),(3,'c')] タプルには違う型を含めることができる。 zipWith はタプルを作る代わりに関数を適用する。 Prelude> zipWith …

リストと値の型

ひとつのリスト中に違う型の値を含めることはできない。 Prelude> [1,2,'a'] :1:1: No instance for (Num Char) arising from the literal `1' at :1:1 Probable fix: add an instance declaration for (Num Char) In the list element: 1 In the definition…

リストを操作する関数

head はリストの先頭の要素,tail は先頭以外の要素を返す。 Prelude> head [1,2,3,4,5] 1 Prelude> tail [1,2,3,4,5] [2,3,4,5] 最後の要素を得るには last が使える。 Prelude> last "abc" 'c' 文字列にも使える。 Prelude> head "abc" 'a' 演算子も関数。…

文字と文字列、リスト

'(シングルクォート)'でかこむ文字はChar型。 Prelude> :type 'a' 'a' :: Char "(ダブルクォート)"でかこんだ文字列はChar型のリスト。[]でかこまれてるのがリストのしるし。 Prelude> :type "abc" "abc" :: [Char] Prelude> :type ['a','b','c'] ['a','…

GHCi

GHCiは対話的に操作できるインタプリタ。:help コマンドで使い方がわかる。 >ghci ___ ___ _ / _ \ /\ /\/ __(_) / /_\// /_/ / / | | GHC Interactive, version 6.4.1, for Haskell 98. / /_\\/ __ / /___| | http://www.haskell.org/ghc/ \____/\/ /_/\___…

Web上の情報

Haskell - HakellWiki The Glasgow Haskell Compiler hugs online Haskellのインタプリタ A Gentle Introduction to Haskell Version 98 (日本語訳) About Haskell (日本語訳) Haskell のお勉強 Haskell Why Functional Programming Matters (日本語訳)

Hello world.

まずはこれだな。 main = putStr "Hello world. This is Haskell!\n" 標準出力へ文字を出力するのは putStr 関数。 main = は代入ではない。Haskell に代入はない。これは main 関数の定義をしている。 GHC はコンパイラなのでまずはコンパイルから。 >ghc -…

GHC をインストール

GHCのダウンロードページからリンクをたどって ghc-6-4-1-bld1.msi をダウンロード。 (standalone) と書いてある方をダウンロードしたけど,もう一つの(Visual Studio Version)てのは何だろ。 msiファイルなのでインストールは簡単。

関数型言語

関数型言語というものに興味があった。 あっただけで今まで調べもしなかったんだけど, ちょうど良さそうな本を発見。つい買ってしまう。入門Haskell―はじめて学ぶ関数型言語作者: 向井淳出版社/メーカー: 毎日コミュニケーションズ発売日: 2006/03メディア:…