タグ

ブックマーク / delihiros.hatenablog.jp (6)

  • Parsec を使って Apache のログファイルをパースしてみる2 - みどりねこ日記

    さて、ログの行をパースすることができるようになったので、これをコマンドラインツールにしましょう。今回は IO と do 記法を用いて作業します。ですので、少なくとも基は知っていることが望ましいです。もし不安なら、Learn You a Haskell を読みましょう。 ユースケースを見ると、圧縮されていないログファイル一つがあるとして、そのログファイルは複数行のログを保持していると推測できます。私たちのパーサは一行をパースします。なので、どうすればいいかを書いてみましょう。 ファイルを読み込む 行ごとに切り離す 各行をパースする 結果を表示する 最初の操作は Prelude にある readFile を使います。つまり、標準でインポートされるということです。 readFile は IO String 型を持ちます。これは、 IO の文脈を壊せないことを表しています。もしこのことで混乱した

    Parsec を使って Apache のログファイルをパースしてみる2 - みどりねこ日記
  • Scalaは関数型プログラミング言語ではない - みどりねこ日記

    面白い記事があったので翻訳してみました。 ライセンスはCreative Commonsです。 しばらくScala仕事をして、疑う余地なく以下のことが断言できるようになりました。 ”Scalaは関数型言語ではありません。クロージャを持ち、静的な型を持つオブジェクト指向言語です。” なので、みんなが嘘の売り文句を延々と言うのをやめてくれないかなと思っています。 これがどういうことなのかを理解するためには、ScalaのメーリングリストにJon Harropが流した挑発的な文を見てみてください。そのスレッドで、Martin O.が ”オブジェクト指向こそが唯一の”美しい”解である” と主張しています。のちにMLで、もう少し丁寧にこのことについて述べていて、それによると、アプリケーションの基幹のデータ構造を何度も変更しなくてはならないようなとき、オブジェクト指向が最適な解であると述べてみます。最終

    Scalaは関数型プログラミング言語ではない - みどりねこ日記
    joan9
    joan9 2012/08/17
  • Parsec を使って Apache のログファイルをパースしてみる - みどりねこ日記

    この記事について この記事は、 Erik さんのを翻訳したものです。 導入 Haskell について知っていればいるほど良いですが、あなたが熱心な Haskeller であるならこの記事は少々退屈に感じるでしょう。 もし Haskell の基について学びたいのであれば、Learn You A Haskell (邦訳:すごいHaskellたのしく学ぼう)をおすすめします。このは何度も読みたくなります!また、どのようにプログラムを組んでいくかを詳しく知りたい人は、 Real World Haskell を読みましょう。実践に生かせる練習問題やアドバイスが沢山載っています。私はこのコードを書くとき、このを頼りに作業をしていました。 Apache はおそらく世界で最も普及しているウェブサーバでしょう。多くのウェブサーバと同じように、様々な情報とともに各リクエストのログをとっています。大きなI

    Parsec を使って Apache のログファイルをパースしてみる - みどりねこ日記
  • Haskellモナドトランスフォーマー(3) - みどりねこ日記

    さて、準備が整ったので、getPasswordやそれを利用するコードを書きなおしてみましょう。 getValidPassword :: MaybeT IO String getValidPassword = do s <- lift getLine guard (isValid s) return s askPassword :: MaybeT IO () askPassword = do lift $ putStrLn "Insert your new password: " value <- getValidPassword lift $ putStrLn "Storing in database ... " (>>=)演算子のお陰で、Nothingなのか、Justなのかをプログラマが手動でチェックする必要がなくなり、随分とすっきりしていますね。 liftを関数getLineやputS

    Haskellモナドトランスフォーマー(3) - みどりねこ日記
  • Haskellモナドトランスフォーマー(2) - みどりねこ日記

    関数getPasswordとそれを利用するコードを簡潔に書くために、IOモナドにMaybeモナドの特性を与えるモナドトランスフォーマーを定義します。これを、モナドトランスフォーマーの慣例的な名付け方に従い、最初に与える特性を持つモナドの名前+Tとし、MaybeTと呼びます。 MaybeTは、m (Maybe a)のラッパーで、mにはどのようなモナドも入ることが出来ます。(ここではIOに注目します。) newtype (Monad m) => MaybeT m a = MaybeT {runMaybeT :: m (Maybe a)} アクセサ関数runMaybeTを使うことによってMaybeTのなかに隠れた中身にアクセスできます。 モナドトランスフォーマー自身もモナドであるため、MaybeT mをMonadクラスのインスタンスとして置く必要があります。 instance Monad m =

    Haskellモナドトランスフォーマー(2) - みどりねこ日記
  • Haskellモナドトランスフォーマー(1) - みどりねこ日記

    ここまでで、モナドがどういうもので、IOモナドは不純な計算のため、Maybeは失敗するかもしれない計算のために、…というように、どのように使われるのかが理解できたのではないかと思います。 実際の作業の中で、複数のモナドの特性を扱いたい場合があります。もちろん、IO (Maybe a)みたいなことを書いて使うことも出来ますが、それでは値を取り出すとき、doブロックの中でパターンマッチングを行わなくてはなりません。モナドのちからを使えば、それすら回避することが出来ます。 ということで、これからしばらくモナドトランスフォーマーについて書いていきます。これは特別な型で、モナドに適用した時、新たな合成されたモナドを生成します。このモナドはそのどちらの性質も持ち合わせることになります。 IT業界に生きる上で、ユーザーにパスワードを強固なものにするようにすすめるプログラムという、よくある問題を例にして考

    Haskellモナドトランスフォーマー(1) - みどりねこ日記
  • 1