読者です 読者をやめる 読者になる 読者になる

関数プログラミング入門 Haskellで学ぶ原理と技法

『関数プログラミング入門 Haskellで学ぶ原理と技法』印刷所に入稿done!2012-10-03 15:21:58 via web2012年10月新刊予定:関数プログラミング入門 Haskellで学ぶ原理と技法 ついに来ました!Bird先生のHaskell本です!翻訳してくださったnobsunありがとうご…

Functional Reactive Programmingのチュートリアルスライドを訳した

FRP - Slides from the tutorial session in Halle Functional Reactive Programmingの勉強中。reactive bananaの資料がわかりやすかったので訳してみました。 frp_tutorial.pdf frp_tutorial.pptx

zipWith

zipWithよくわかってなかったのですが、やっとわかりました。 main = print $ zipWith (+) [1, 2, 3] [4, 5, 6] [5,7,9]zipは[1, 2, 3]と[4, 5, 6]を渡すと[(1, 4), (2, 5), (3, 6)]のようにそれぞれの要素を綴じ合わせてタプルにしますが、zipWithは綴じ合…

Parsec 条件一致した行を無視

ちょっとしたログ解析にHaskellのParsecを使ってました。 「行に特定の文字列が含まれていたら無視する」というよくある簡単なフィルタ処理です。C++のBoost.Spirit.Qiであれば *(qi::char_ - "[condition]") のように書く処理。これをParsecでやるには、man…

HaskellでCプリプロセッサを使う

これくらいしかできませんでしたが・・・。 data.txt ls = [1, 2, 3]main.hs {-# LANGUAGE CPP #-} #define MY_CONSTANT 2 #include "data.txt" main = do print MY_CONSTANT print ls 2 [1,2,3]まず、単純なdefineは問題なくできました。 data.txtは、最初…

初心者向けFRPライブラリ

"Best" FRP package for newbie - Haskell Cafe Haskell Cafeで、「初心者向けのFRP(Functional Reactive Programming)のライブラリはどれ?」という話題で盛り上がってました。 今のところ、reactive-bananaが人気のようですが、ほかにNetwire、Yampa、Anim…

2つの値を入れ替える

Haskellでswap。 swap :: (a, b) -> (b, a) swap (a, b) = (b, a) main = print $ swap (1, 2) (2,1)swapは、Data.Tupleに用意されています。 import Data.Tuple main = print $ swap (1, 2) C++でもtupleで似たようなことを前にやってたりしました。 2つの…

型の最大値を取得する

型の最大値を取得するには、PreludeのmaxBound関数を使用する。::で型を指定する。 (C++で言うところのnumeric_limits::max()) main = do print $ (maxBound :: Int) print $ (maxBound :: Char) 2147483647 '\1114111'maxBound関数を使用する型は、値が有限…

リスト要素の最小値と最大値

調べ物をしてたらたまたま見つけたのでメモ。 minimumとmaximumを使用する。 main = do print $ maximum [3, 1, 4] print $ minimum [3, 1, 4] 4 1こういう関数は型から探しにくいのでHoogleがあまり役に立たない。 Prelude.minimum Prelude.maximum

hFlushを忘れずに

Haskellで簡単なサーバーを書いて嵌ったこと。 クライアントでデータを送る際、hFlushしないと送り終わる前に接続が切れてしまう。 import Network import System.IO main :: IO () main = withSocketsDo $ do hSetBuffering stdout NoBuffering server `cat…

Haskellでsleep

sleepにはControl.ConcurrentモジュールのthreadDelayを使うらしい。引数はミリ秒マイクロ秒。 import Control.Concurrent main = do threadDelay (2 * 1000 * 1000) print "hello" これを実行すると2秒後に"hello"が表示されます。

Haskellの勉強 - 型安全なイベント

Type-safe events このエントリを読んでわかったことのメモ。 以下のような感じで、異なる型のイベントを同じように扱いたい。 data Ping = Ping Int | Pong Int data Log = Warn String | Info String main = do fire $ Warn "Starting the engines!" fire …

Type Families

HaskellのGHC拡張でType Families(型族)というのがあります。これはC++テンプレートメタプログラミングをやったことがある人にはなじみ深い、型を受け取って型を返す型関数(メタ関数)を実現する機能です。 たとえば、以下は型aを受け取って型aを返す型関数Id…

Networkモジュールを使ってGET

Haskell でソケット通信をやってみる - yasuabe blog このエントリを見て、簡単そうだったので遊んでみました。 httpでGETをするだけですが、こんな感じで書けました。 import Network import System.IO getCommand :: String -> IO String getCommand hostN…

ParsecでApplicativeを使ってみる

Applicativeを使うとParsecが書きやすくなると聞いたのでやってみました。 "(123)"という文字列から、カッコに囲まれた123という値を取り出す処理です。 Applicativeを使わない場合: import Text.Parsec import Text.Parsec.String parseText :: Parser Int…

GADTs使ってみた

このエントリは、Haskell Advent Calendar 2011の参加記事です。 今回は、HaskellのGHC拡張であるGADTs(Generalized Algebraic Data Types : 一般化代数データ型)を調べて使ってみたという内容を書いてみました。 最初に、GADTsはGHC拡張なので、使用するに…

Parsec カンマ区切り文字列のパース

カンマ区切りで書かれた整数のリストをパースします。 sepBy, sepBy1関数がちょうど「x区切りでyパーサーを実行する」ということができるので使えそうです。 C++のBoost.Spirit.Qiでいうところの、operator%()です。 import Text.Parsec import Text.Parsec.…

Parsec カッコで囲まれた文字列を取り出す

"(abc)"の"abc"を取り出します。 import Text.Parsec import Text.Parsec.String parens :: Parser a -> Parser a parens = between (char '(') (char ')') parseText :: Parser String parseText = parens $ many $ noneOf ")" run :: Show a => Parser a -…

Parsec使い始め

以前から使おうと思って手を出してなかったParsecを使い始めました。 Parsecは、最近いろんな言語で移植が行われている構文解析のライブラリです。 パーサーの検証でいつも最初にやっている、"(123)"という文字列から123という整数を取り出す処理をParsecで…

Haskell Advent Calendar 2011

Haskell Advent Calendar 2011 誰も立ててなかったので立てました。 私はGADTsを調べて使ってみた的なエントリを書くつもりです。

必ず成功させるという設計選択

リストの先頭要素を取得するPreludeのhead関数は、空リストを与えると失敗します。 「1要素以上なら必ず成功する」という大半の状況でうまくいく処理のためにエラーハンドリングをするのはめんどくさいですし、エラーの可能性を残すというのは不安です。現状…

停止するall

foldrでallを書くと、全てのリストが評価されるから while (it != end) { if (!pred(*it)) return false; ++it; } みたいな途中で停止する動作にすることはできないんじゃないかと思い込んでいたのですが、どうやらちゃんと停止するようです。 allの定義を見…

takeWhileでtake、dropWhileでdropを定義する

ちょっと前に id:uskz 先生に「PStade.OvenはtakenWhileからtakenを定義してるから、Haskellでもできるんじゃないですか」とネタ振りしてたので、書いてみました。 インデックスのリストと一緒にループして、インデックスと比較する述語をxxxWhileに渡します…

GHC 6.12.1からUnicode IOがサポートされたらしい

Unicode Text I/Oというのが入ったらしい。 http://www.sampou.org/cgi-bin/w3ml.cgi/haskell-jp/msg/480 以下、Windowsで試しました。 stdoutにはうまく出力できないのでファイルに出力。 main.hs(UTF-8で保存) import System.IO main = do h <- openFile f…

C++の人がHaskellを学ぶべき理由

※「C++(compile time)は純粋関数型言語だよ(by id:DigitalGhost)」というのは全く関係ないです。 C++の人がHaskellを学ぶと、const付けないと気が済まなくなり、 if文よりも条件演算子を多用するようになります。(きっと) Haskellを学ぶ動機としては、モナド…

Haskellの次期バージョン

Announcing the new Haskell Prime process, and Haskell 2010 いけがみさん情報。 Haskellの次のバージョンはHaskell'(プライム)と呼ばれていて 早ければ2010年には決まるかも、という状況らしいです。 ConcurrencyとかAssociated TypesとかFunctional Depe…

reverse関数

じょにーさんのにっき - Haskellでreverse関数を作ってみた fold使えば1行で書けますよ、と。 reverse = foldl (flip (:)) []

『Programming in Haskell』 10章 型とクラスの宣言

『Programming in Haskell』のスライドを10章まで翻訳しました。 以下のエントリ経由でダウンロードしてください。 『Programming in Haskell』のスライドを翻訳(※随時更新)

『Programming in Haskell』 9章 対話型プログラム

『Programming in Haskell』のスライドを9章まで翻訳しました。 以下のエントリ経由でダウンロードしてください。 『Programming in Haskell』のスライドを翻訳(※随時更新) 残り2章です。

『Programming in Haskell』 8章 関数型パーサー

『Programming in Haskell』のスライドを8章まで翻訳しました。 以下のエントリ経由でダウンロードしてください。 『Programming in Haskell』のスライドを翻訳(※随時更新)

モナド入門

『Introduction to Functional Programming using Haskell』10章モナドからメモ。 本章は、モナディックプログラミングと呼ばれる関数型プログラミングの新たなスタイルについて紹介します。 モナディックプログラムは、関数型環境での相互作用(interaction)…

型の別名

Haskellでは、typeキーワードで型の別名を定義します。 type Point = (Integer, Integer) foo :: Point -> String foo p = show p foo (0, 1) → "(0, 1)"

以下について教えてあげよう

東方算程譚 - 以下について教えてあげよう♪ Haskellでやってみた。 import Char main = print $ problem "Abc012_59F_#012Gh" problem :: String -> String problem = proc . break (== '#') proc :: (String, String) -> String proc (s, ss) = (map (toLow…

show

showは、引数を文字列に変換する関数です。 show True → "True" show False → "False" show 3.14 → "3.14" 以下のようなユーザー定義の型の場合には data Day = Sun | Mon | Tue | Wed | Thu | Fri | Sat Day型をShowクラスのインスタンスにすることで show…

nullary tuple

『Introduction to Functional Programming using Haskell』 2.4 Tuplesからのメモ。 以下の場合、piは引数をとらずに戻り値のみを持っているのでこれは定数になります。 pi :: Double pi = 3.14 定数を関数レベルに引き上げるためには、ユニット式というも…

ガード式 vs 条件式

『Introduction to Functional Programming using Haskell』届きました。この本は、Mirandaで書かれていた『関数プログラミング』のHaskell版です。 1章 Fundamental concepts、1.5 Definitionsのあたりからメモ。 条件式の代わりにガード式を使用する利点は…

『Programming in Haskell』 7章 高階関数

『Programming in Haskell』のスライドを7章まで翻訳しました。 以下のエントリ経由でダウンロードしてください。 『Programming in Haskell』のスライドを翻訳(※随時更新) foldrはすばらしい!

『Programming in Haskell』 6章 再帰関数

『Programming in Haskell』のスライド、6章まで訳しました。 以下のエントリ経由でダウンロードしてください。 『Programming in Haskell』のスライドを翻訳(※随時更新)

『Programming in Haskell』のスライドを翻訳(※随時更新)

『Programming in Haskell』の著者Graham Huttonによる、 各章の要点をまとめたスライドが以下のURLで公開されています。http://www.cs.nott.ac.uk/~gmh/book.html とてもおもしろい内容だったので少しずつ翻訳してます。 翻訳したスライドは、以下の場所で…

リスト内包表記でmapとfilter

map(写像)は、再帰で書くとこう mapp _ [] = [] mapp f (x: xs) = f x : mapp f xs リスト内包表記を使った場合はこうなる map f xs = [f x | x <- xs] filter(濾過)は再帰で書くとこう filter _ [] = [] filter p (x:xs) = if (f x) then (x:(filter p xs))…

リスト内包表記

ふつけるだとリスト内包表記について1ページしか書かれていなかったのですが 『関数プログラミング』ではけっこうくわしく書かれていて、 サンプルもいっぱい載ってるのでわかりやすいです。 ということで、お試しをいくつか書きます。 単純な1〜3の要素を…

単射、逆関数、全射、全単射

いま『関数プログラミング』という本を読んでます。 関数プログラミング作者: R.バード,P.ワドラー,武市正人出版社/メーカー: 近代科学社発売日: 1991/04メディア: 単行本購入: 7人 クリック: 82回この商品を含むブログ (13件) を見る ちょっと難しくなって…

続々・縦書き

続・縦書きのさらに続き Arrowで書き直してみた import List import Control.Arrow main = getContents >>= arr (lines >>> reverse >>> normalize >>> transpose >>> unlines >>> putStrLn) -- 長さを同じにする normalize = (maximum . map length &&& map…

Arrow勉強中

ポイントフリースタイルで書いた場合 main = print $ wc "Hello World Akira" wc = length . words Arrowを使った場合 import Control.Arrow main = print $ wc "Hello World Akira" wc = arr (words >>> length) "Akira"が渡されたら左側(++ " : C++")、そ…

続・縦書き

縦書き?の続き 行が異なる長さでもいけるようにした import List main = putStrLn . unlines . transpose . normalize . reverse . lines =<< getContents -- 長さを同じにする normalize :: [String] -> [String] normalize s = fillSpace s (maxLength s)…

縦書き?

ネタ元:縦書きの続き - The beast of halfpace Haskellだとこんな感じでしょうか(2行) import List main = getContents >>= print . transpose . reverse . lines こういうテキストを用意して Hello World Akira実行するときに食わせるとこういうリストがで…

C++コンセプトとHaskell型クラスの比較

メモA comparison of C++ concepts and Haskell type classes

ふつけるでMaybeモナド中

config :: [(String, [(String, String)])]; config = [ ("database", [("path", "var/app/db"), ("encoding", "euc-jp")]), ("urlmapper", [("cgiurl", "/app"), ("rewrite", "True")]), ("template", [("path", "/var/app/template")]) ] main = print $ c…

パターンマッチで階乗

main = print $ fact 3 fact :: Int -> Int fact 0 = 1 fact x = x * fact (x - 1)

多相型と型クラス

Haskellの多相型と型クラスって C++0xのテンプレートとコンセプトの関係に似てるなー