Haskell

関数プログラミング入門 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』のスライドを翻訳(※随時更新)