This tutorial is about server programming in concurrent Haskell. Although, Simon Marlows' web server written in Haskell [1] is a good reference, tutorial for newbies driven by simple example is needed. It is a great pleasure to program servers in applicative languages supporting concurrency. Erlang is an excellent example which had been highly successful in the industry. Erlang's message passing s
#blognavi このサイトでは最終的にHaskellで[[KISSローダー>http://www.kiss-wkp.com/]]を作るという野望があるわけで。 今回は、コンフィグファイルの読み込みで使うであろう、Parsecに手を付けてみました。 [[Parsecのサイト>http://www.cs.uu.nl/~daan/parsec.html]] Parsecを使えば簡単にLL(n)文法のテキストファイルを簡単に読み込めるようになるらしいです。(理論的なことはよくわかってない) 自分は、上記のサイトのparsec-2.0.zip をダウンロードしてきたあと、Hugsの作業フォルダにTextフォルダ以下を展開しました。こうすればとりあえずは使えるようになります。 (詳しくはHugsやGHCのマニュアルを読んでください) -Parsecの特徴 Yacc+LexやJavaCCが「文法ファ
実は昨日の話題はこれから書こうとする話とつながりがあるのだ。 (直接的には無いけど) (序) 突然であるが、Haskellは文字列処理が強力だと思う。 それも最強レベルに。 他のいわゆる文字列処理が得意であるとされる言語のように 正規表現による置換が可能であるとか、文字列がオブジェクトで 有用なメソッドがたくさん使えるとかそういった 小手先のものではなくてもっと根本的なレベルで強力なのである。 それはHaskellに於いて文字列が文字のリストであらわされていることに 起因する。わからない人から見ると文字列がリストであるということは Cにおいて文字列が配列で表されているのとかぶるかもしれない。 Haskellが文字列をリストとして持っていてうれしいというのは Haskellが全言語中でもほとんど最強のリスト操作能力を持っているからである。 Cで文字列が配列になっていても何もうれしくないのは、
誰にも頼まれてないのに Haskell の復習をしています。前から気にくわなかったのが Haskell の do 記法です。例えばコンソールから二つの文字を入力して結果を出すだけのプログラムをこういう風に書きます。 main' = do num1 <- getLine num2 <- getLine print $ read num1 + read num2 これはかったるい!そう思いませんか?何故次のように書けないのか!これはモナドが悪いのか? main'' = print ( read getLine + read getLine ) そういうわけで、素人ながらもうちょっとマシに書けるのでは無いかと試してみました。 まず、read getLine と書けない件。getLine はコンソールから文字列を受け取るモナドだけど、read は文字列自体を受け取る関数なのでうまく合わない。例えて
さて、http://jarrett.cs.ucla.edu/ometa-js/#OMeta_Tutorial にある OMeta の電卓の例をそのまま parsec で作ってみます。OMeta は言語に必要な処理を、文字解析に留まらず出来るだけ OMeta で行うのが売りです。また逆に parsec はパーサ特有の処理を、特別な言語を使わず Haskell だけで行うのが売りです。真逆で面白いので、OMeta と parsec を対比させる事で両者の特徴を浮き上がらせてみます。 module Main where import Text.ParserCombinators.Parsec import Text.ParserCombinators.Parsec.Pos( updatePosChar, updatePosString ) run :: Show a => Parser a ->
最近 Haskell に触ってなくて寂しいなあと思い、パーサーコンビネータと言うのを試してみました。まず import はこのようにします。 import Text.ParserCombinators.Parsec Parsec には便利なパーサの部品が沢山ありますが、勉強のためあえて自作します。まずある文字列の先頭が a の時だけマッチするやつを作ります。特定の文字にマッチするには char 関数を使います。char 関数以外は、パーサを駆動するだけのための部品です。 aParser :: String -> IO() aParser input = out (parse (char 'a') "error" input) where out (Right x) = print x out (Left err) = print err -- Main> aParser "abc" --
http://d.hatena.ne.jp/sumim/20080709/p1 を始めとして色んな方々がやっているので私も。 ちょっと気色の悪い方法を使いました。 #define _ 1 #define X 365 main = X / _ / X < "Please see next week!" where (<) a b = if a == 1.0 then do print ("Hidamari Sketch 365 "++b) else do print ("owata"++b) infix 0 < ghc -cpp yuno.hs ghcで動きます。これはどういう事かと言うと見れば分かりますがghcではプリプロセッサを走らせる事が出来るので、そいつを使ったと。 で走るプリプロセッサはcppなので、まんまdefineマクロが使える訳ですね。 まぁこの辺はghcのソースコード読もう
上で述べた通りに http://www.cs.nott.ac.uk/~gmh/pearl.pdf こいつを読んだのでそれについて書く。 Parser Combinatorとか滅茶苦茶難しそうだよなーと今まで思っていたけども全くそんな事は無かった。 ただ眠いので起きてから感想とかはつらつらと。 論文のメモ 1.Introduction Haskellにおける再帰下降パーザの実装についてのpaperらしい。 焦点は functional parsers structure functional programsの為のMonad, Haskellのmonadic programの為の特別記法の使用とかそんなの。 functional programmingの旨味を活かすという事かしら。 2.A type for parsers 何にせよ型が大事。 newtype Parser a = Parse
http://www.icfpcontest.org/ 疲れた…。 今年はまあ何というか、孤独との戦いであった。 来年はちゃんと休みをもらって、ちゃんとチームを作って出たいと思った。 初日はkzk氏、hillbig氏とともになんかやってました。 今年は問題がシンプルだなと思った。 時間制限3時間とかのICPCのJava Challengeとかよりもはるかにシンプルなのですけど。 そして、問題の制約が恐ろしく緩い。 どこまで想定すればいいのでか。 そして、Windows版が用意されないシミュレータ。 アメリカ語を2時間ぐらい掛けて頑張って読んで、 適当にプロトコルかいたりしてたら、 開始4時間後ぐらいには愚直ダッシュコントローラができてたような気がする。 しばらくしてナイーブな敵と穴避けアルゴリズムが完成して、 すでに与えられたマップが終わってしまった。 しばらくしてMLにスコア自慢が現れて
自分でもよく飽きないなーと思いますが、またしてもゆのネタです。 私のアタマではどう頑張っても正式なゆの式を書くことができなかったので、AAに関しては激しく妥協しつつ、別方向で変態的なコードを作ろうとしてみました。その結果が以下です。 import Prelude hiding ((<),(/),(-)) import Data.List (intersperse) import Debug.Trace (trace) data X = X | I | X :/ X | X :< String class P a where p :: a instance P X where p = I instance P Bool where p = False risk = "Hidamari" etc = "Sketch" infixr 3 - infixr 6 / infixr 5 < _ < h
_ が変数として使えないので、パターンマッチの文脈で無理やり使ってみたら、なんだか微妙な表情になってしまいました。私には X が目で / と | は口元のシワにしか見えません。 import Prelude hiding ((<),(/)) import System.IO.Unsafe import qualifed System.IO.UTF8 as U data X = X utrace = seq . unsafePerformIO . U.putStrLn X < x = utrace ("ひだまりスケッチx365 "++x) True main = return $! X/X where X / _ | X < "来週も見てくださいね!" =3 苦しまぎれに / の代わりに | を使っています。 trace を使って副作用を出してみました。 $! で強制的に評価してます。 ma
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く