タグ

ブックマーク / qiita.com/tanakh (6)

  • Stackを使って楽しくHaskellスクリプティング - Qiita

    今までいまいちモチベが上がらなかったHaskellでスクリプトを書くというのが、急に現実的になってしまったので、紹介します。 Haskellでスクリプティングする上での問題点 Haskellはもともと簡単なテキスト処理を書きやすいプログラミング言語ではあるのですが、標準で提供されているライブラリはあまり多くないので、必要に応じてコミュニティーパッケージを導入しなければその力を存分に発揮することができません。 通常のパッケージなら、cabalに依存関係を書けばパッケージマネージャで自動的に(コケることもありますが、理想的には)管理できるのですが、シェルスクリプトやPerl、あるいは最近ならPythonでやるような、コードを直接インタプリタで実行するような形のコードでは、そのような依存関係を自動で解決することは難しく、その上、仮にやろうとしたところで、いつまでもその依存パッケージが新しいコンパ

    Stackを使って楽しくHaskellスクリプティング - Qiita
  • Haskellのビルドツール"stack"の紹介 - Qiita

    Stackとは? つい先日のことですが、Stackage界隈からstackというツールがリリースされました。リリースされたとはいえ、開発され始めたのがちょっと前のことですし、現在も盛んに機能が追加されているので、絶賛開発中であるとかそういったほうがいいかもしれません。 まだ開発の始まったばかりのツールなのに、なぜこんな紹介記事を書こうと思ったのかというと、このツールがHaskellの開発において極めて有用になることが確定的に明らかであって、すでに荒削りながらも、大変便利に使えているからなのです。そしてここで紹介することで、多くの読者の方に興味を持ってもらって、それで開発がさらに盛り上がっていくと嬉しいなあと、そう思った次第であります。 なお、stackの開発が始まる少し前に、stackage-cliを始めとするいくつかのツールがリリースされましたが、今後開発はstackに一化されるような

    Haskellのビルドツール"stack"の紹介 - Qiita
  • 継続モナドによるリソース管理 - Qiita

    継続モナドって何に使うんだ問題に対する一つの例。 リソース管理の問題 プログラミングをやっていると必ずまとわり付いてくるのがリソース管理の問題です。ここで指すリソースというのは、ファイルのハンドルだとか、ソケットだとか、排他処理のためのロックだとか、グラフィックのハンドルだとかそういう話で、GCのない言語だとメモリの管理もこれに含まれるでしょうか。 言うまでもなく、リソースを確保した後はしかるべきタイミングで確実に解放してやる必要があります。しかし往々にして、現実のプログラムではリソースの解放漏れが発生してしまいます。単に解放するコードを書き忘れると言うのが一番単純でしょうもない理由ですが、それでも、C言語のようにリソース解放のための特別な仕組みを持たない言語では、これを徹底するのも結構骨の折れることだったりします。それはともかく、もう少し高尚な悩みとしては、例外との組み合わせで発生する解

    継続モナドによるリソース管理 - Qiita
  • optparse-declarative: 宣言的な型レベルコマンドラインパーザー - Qiita

    使いやすさを目指したコマンドラインパーザー、optparse-declarativeというのを作りました。 これは何ですか? コマンドラインオプションを解析して、しかるべき処理を呼び出すためのライブラリです。ちゃんとした機能を備えたコマンドラインパーザーを、とにかく書きやすい形のAPIで提供することを目指して作っています。 コマンドラインパーザーっていうのは、プログラム全体のライフライクルから考えると、いじっている時間は決して長いわけではないので、新しいプログラムをつくろうかとなった時に、はてどうやってライブラリを使うのだったんだろうかと毎回忘れてしまいます。それでもって、それがわかりづらいものだと、その思い出すという事自体がわりと心理的障壁になってしまったりしていけないと思って、そういうところを目指したものを作りました。宣言的で型レベルとタイトルに入っていますが、簡単さを目指していたら勝

    optparse-declarative: 宣言的な型レベルコマンドラインパーザー - Qiita
  • ぷよぷよ in Lens - Qiita

    import Control.Lens import Control.Monad import Control.Monad.State import Data.List import qualified Data.Map as M paint :: M.Map (Int, Int) Char -> (Int, Int) -> Int paint mm pos = evalState (go pos) mm where go (i, j) = do b <- use $ at (i, j) if b == M.lookup pos mm then do at (i, j) ?= 'x' vs <- forM [(1, 0), (-1, 0), (0, 1), (0, -1)] $ \(di, dj) -> go (i + di, j + dj) return $ 1 + sum vs els

    ぷよぷよ in Lens - Qiita
  • tagsoupとregex-tdfaでHTMLからリンク抽出 - Qiita

    {-# LANGUAGE OverloadedStrings, QuasiQuotes #-} import Control.Applicative import Control.Monad import qualified Data.ByteString.Lazy.Char8 as B import Network.HTTP.Conduit import System.Cmd import System.Environment import System.Process.QQ import Text.HTML.TagSoup import Text.HTML.TagSoup.Tree import Text.Printf import Text.Regex.TDFA baseUrl = "http://dumps.wikimedia.org/" extractLinks url rege

    tagsoupとregex-tdfaでHTMLからリンク抽出 - Qiita
  • 1