タグ

ブックマーク / tnomura9.exblog.jp (20)

  • Programming with Arrows 読解 目次 | tnomuraのブログ

    Programming with Arrows 読解 1 --- 1 Introduction Programming with Arrows 読解 2 --- 1.2 The Arrow class Programming with Arrows 読解 3 --- 1.3 Arrows as computations Programming with Arrows 読解 4 --- 2 The Arrow classes Programming with Arrows 読解 5 --- 2.2 Arrows and conditionals Programming with Arrows 読解 6 --- 2.3 Arrows and feedback Programming with Arrows 読解 7 --- 2.3 Arrows and feedback (続き) Progra

    Programming with Arrows 読解 目次 | tnomuraのブログ
  • Programming with Arrows 読解 1 | tnomuraのブログ

    このエントリーからしばらく 『Programming with Arrows』 の解読をやっていこうと思う。リンクからダウンロードすればPDFで読むことができる。 1 Introduction 1.1 Point-free programming Haskell では引数を省略した関数を . 演算子で合成関数をつくることで関数を定義する point-free style がある。次のプログラム count w は point-free style で書かれたプログラムの例だ。文字列の中で、w と一致する単語がいくつ現れるかを計算する。 Prelude> let count w = length . filter (==w) . words 実行例 Prelude> count "a" "Consider this simple Haskell definition, of a functi

    Programming with Arrows 読解 1 | tnomuraのブログ
  • All About Monads 読解 18 | tnomuraのブログ

    Part III - Introduction All about monads のパートIではモナドの考え方について、パートIIでは Haskell 標準のモナドについて解説されていた。しかし、実際には State モナドで状態を利用しながら I/O モナドを使いたいなど、モナドを混在させて使いたい場合が頻繁にある。Part III ではこのような場合に用いる monad transformer について解説されている。 Combining monads the hard way 複数のモナドを組み合わせて使いたいときに monad transformer を使う事になるが、その前に、monad transformer を使わないで、直接プログラムする方法を考えてみよう。そうすることで、複数のモナドを組み合わせて使う際の基的な考え方や、monad transforer を使う利点がわか

    All About Monads 読解 18 | tnomuraのブログ
  • PEG と 文脈自由文法の違い | tnomuraのブログ

    PEG (Parsing Expression Grammar) も 文脈自由文法もプログラム言語の文法を定義する方法だ。おまけに、どちらも再帰下降構文解析という手法で実装することができるので、一体どこが違うのかが分り難い。 そこで、原点に返って構文解析とはどのようなことをするのかを考えてみよう。プログラムのソースファイルに書き込まれているプログラムは単なる文字コードの並びが延々とづづいているだけだ。アルファベットを延々と書き並べられた紙のテープを渡されて解読しなさいといわれているようなものだ。 これでは取り付く島がないのでどうするかというと、このテープを単語などのまとまりごとに、小さく切っていく。この作業をしても単に単語が順番に並んでいるだけでは、意味不明だ。この単語の並びを関連ある物ごとに並べたり、関連性の階層を調べたりして、単語どうしの関連性の構造を見つけなければならない。この木構造

    PEG と 文脈自由文法の違い | tnomuraのブログ
    nfunato
    nfunato 2015/07/04
  • tnomuraのブログ

    日記

    tnomuraのブログ
  • ErrorT モナド・トランスフォーマーの使い方 | tnomuraのブログ

    hackage.haskell.org の Control.Monad.Error 文書には Error モナドのモナド・トランスフォーマーである ErrorT の使い方の例が紹介されている。次のプログラムがそれだ。原著からのコピペでそのまま動いた。 import Control.Monad.Error -- An IO monad which can return String failure. -- It is convenient to define the monad type of the combined monad, -- especially if we combine more monad transformers. type LengthMonad = ErrorT String IO main = do -- runErrorT removes the ErrorT

    ErrorT モナド・トランスフォーマーの使い方 | tnomuraのブログ
  • State モナド | tnomuraのブログ

    State モナドの使い方がもうひとつよく分からなかったので、State Monad のチュートリアルを読んでいたら、Parsec と同じ使い方をすれば良いのだと気がついた。 Parsec ではパーサのモナドをプログラムしても、それだけでは何もしてくれない。たとえば、Parsec の(プリミティブ)関数の letter は、次のように parser 関数の引数にして実行しないとなにもしない。 Prelude Text.Parsec> parse letter "" "hello" Right 'h' また、要素的 (primitive) な関数はパーサーコンビネータと組み合わせることによって複雑なパターンに対応することができる。 Prelude Text.Parsec> parse (many1 letter) "" "hello world" Right "hello" さらに、パーサ関

    State モナド | tnomuraのブログ
  • cabal | tnomuraのブログ

    Haskell を実用的なプログラムに活用しようと思うときは、パッケージ管理システム cabal の使い方に慣れておくことが必要だ。Haskell Platform をインストールしたら、cabal もインストールされている。 パッケージのインストールなど、cabal を使うときは管理者権限で実行しないといけないことが多い。Ubuntu であれば sudo cabale install yesod のように sudo コマンドを利用する。また、Windows の場合は、スタートボタンを押して、検索窓に cmd を入力した後、Ctrl + Shift + Enter を押すと、管理者権限のコマンドプロンプトが開く。 cabal で最初にすることは、パッケージリストのダウンロードだ。 > cabal update HakageDB で利用可能なパッケージのリストをとるには list コマンドを

    cabal | tnomuraのブログ
  • Isomorphism, retraction, section | tnomuraのブログ

    圏は対象と射の集まりだが、その最も要素的なものとして2つの集合(対象)とその間の写像(射)の性質について考えてみよう。 まず、集合 A から集合 B への写像 f があるとする。これが圏になるためには、集合 A のどの要素 a にも対応する集合 B の要素 f(a) が定義されていなければならない。このとき集合 A は射 f の domain で、集合 B は codomain となる。(圏という場合には、射の合成の存在と、結合律と、単位元律が必要だ。定義はこれを満たしているが詳細は省略する。) 例えば、A = [a, b, c] で B = [h, i, j, k] であれば、f(a) = h, f(b) = i, f(c) = j となる射 f と集合 A, B は圏である。 さて、このような集合 A から集合 B への射 f :: A -> B があるとき、それとは逆方向の、 g :

    Isomorphism, retraction, section | tnomuraのブログ
  • tnomuraのブログ

    日記

    tnomuraのブログ
  • tnomuraのブログ

    公理的集合論の説明では、必ず順序集を集合で表現する方法が出てくるが、(Wikipedia の「ツェルメロ=フレンケル集合論」の記事) 最初のフォン・ノイマン順序数 0 = {} =∅ 1 = {0} = {∅} 2 = {0, 1} = {∅, {∅}} 3 = {0, 1, 2} = {∅, {∅}, {∅, {∅}}} 4 = {0, 1, 2, 3} = {∅, {∅}, {∅, {∅}}, {∅, {∅}, {∅, {∅}}}} なんか、きつねに抓まれたような気になる。公理的集合論ではものの集まりという直感的な集合は定義できないのではないかという気がしてくるのだ。 ところで、公理的集合論では、変数は一階述語論理の個体変項だが、意味論的には変数の全ては集合として扱うようである。したがって、任意の2つの要素 x, y からなる集合を定める対の公理は次のようになる。

    tnomuraのブログ
  • Programming with Arrows 読解 1 | tnomuraのブログ

    このエントリーからしばらく 『Programming with Arrows』 の解読をやっていこうと思う。リンクからダウンロードすればPDFで読むことができる。 1 Introduction 1.1 Point-free programming Haskell では引数を省略した関数を . 演算子で合成関数をつくることで関数を定義する point-free style がある。次のプログラム count w は point-free style で書かれたプログラムの例だ。文字列の中で、w と一致する単語がいくつ現れるかを計算する。 Prelude> let count w = length . filter (==w) . words 実行例 Prelude> count "a" "Consider this simple Haskell definition, of a functi

    Programming with Arrows 読解 1 | tnomuraのブログ
  • Haskell/Continuation passing style | tnomuraのブログ

    All about monads の解読が Continuation Monad になってストップしてしまった。そもそも、継続渡しスタイル CPS や継続 contiuation の意味がよくわかっていなのだから無理もない。お茶を濁してそれらしい記事にしてもいいのだが、自分もわかっていないし、意味の分からない文章を読まされる人も迷惑だろう。 そこで、いつもの様に Google 先生に継続について聞いてみた。できれば日語の文書が欲しかったのだが、納得できるものが見つからなかった。そこで "continuation monad" で検索して WikiBooks の "Haskell/Continuation passing style" という記事を見つけた。continuation monad だけでなく、継続の初歩から分かるような例がついているようなので挑戦してみる。 しかし、冒頭の C

    Haskell/Continuation passing style | tnomuraのブログ
  • 圏論の言葉 その2 | tnomuraのブログ

    endomap endomap は domain と codomain が同じ射だ。そう珍しいものではなく、整数の集合を domain とし、整数の2倍の値を返す関数(射)は、codomain が整数になる。 Prelude> :set +m Prelude> let Prelude| double :: Int -> Int Prelude| double x = 2 * x Prelude| Prelude> double 3 6 有限個の数値の集合の endomap のうち、全単射になるものは、順列だ。 Prelude> let Prelude| f 1 = 4 Prelude| f 2 = 3 Prelude| f 3 = 2 Prelude| f 4 = 1 Prelude| Prelude> map f [1,2,3,4] [4,3,2,1] identity map endo

    圏論の言葉 その2 | tnomuraのブログ
  • 圏論の言葉 | tnomuraのブログ

    Haskell を勉強し始めて IO モナドなんかに出くわさなければ圏論など近づこうともしなかっただろうが、モナドを正確に理解したくなって、圏論の入門書 Conceptual Mathematics: A First Introduction to Categories F. William Lawvere、 Stephen H. Schanuel を読み始めた。高校卒業程度の予備知識でも読めるように懇切丁寧に書かれているのがうれしい。 しかし、圏論は圏論なので、そう簡単に理解できるようには思えない。そこで、分かったと思えたところをまとめてみる事にした。 圏論は適用範囲が広い抽象的な考え方なので、具体的なイメージが作りにくい。やはり、慣れ親しんだ集合と写像を使える「集合の圏」から始めた方が良いようだ。集合と写像を、対象と射として取り扱う事によって、他の圏に対してもイメージを広げていく事がで

    圏論の言葉 | tnomuraのブログ
  • sqlite3 によるアミノ酸データベース | tnomuraのブログ

    sqlite3 の操作の学習用になにか手軽なデータベースはないかと考えていたら、自分の過去記事の「sqlite3 の使い方」にアミノ酸のデータベースを作る記事があった。その記事の CSV のデータをコピーして vi に張りつけ、aminoacid.csv というファイルを作った。 次に、sqlite3 で次のようにして anminoacid.db を作りテーブル aa を作成した。 $ sqlite3 aminoacid.db "create table aa (name text,let3 text,let1 text,polarity text,acidity text,hydropathy real);" 最後に、aminoacid.csv を aminoacid.db の aa テーブルにインポートした。 $ sqlite3 -separator , aminoacid.db ".

    sqlite3 によるアミノ酸データベース | tnomuraのブログ
  • tnomuraのブログ

    日記

    tnomuraのブログ
  • Haskell 記事リスト | tnomuraのブログ

    Haskell 関連の記事のリスト 1.Haskell の概要 使い捨てプログラムの作り方 [2009-08-04 19:27] Haskell のリスト操作 [2009-08-06 07:24] Haskell の高階関数 [2009-08-06 12:56] Haskell の関数 [2009-08-07 06:46] Haskell の制御構造 Haskell の遅延評価 [2009-08-07 12:49] クイックソート シーザー暗号を作ってみた Haskell ワンライナー ghci 版 Haskell あれこれ 再帰 Haskell あれこれ 再帰の種類(数値型) Haskell あれこれ 再帰の種類(リスト型) Haskell のプログラムは全て式の置き換えで理解できる。 Haskellでは再帰的定義も式の置き換え(展開) Haskell でユーザ定義のデータを簡単に作る方

    Haskell 記事リスト | tnomuraのブログ
  • System.Time モジュールの使い方 | tnomuraのブログ

    Data.List モジュール探検の最中だが、ちょっと寄り道をして System.Time モジュールを散策してみる。Haskell の標準モジュールの概観は Haskell Hierarchical Libraries で眺めることができるが、かなりの量がある。 今日はその中から System.Time モジュールを使って、現在の日付と時刻を表示することに挑戦する。例によって、プログラムファイルを作らずに、ghci のコマンドラインからの操作だけでそれをやってみよう。ライブラリの使い方は、その中の関数がどう働くかをリアルタイムに見るのが一番よくわかるからだ。 まず、Prelude に System.Time モジュールをインポートする。 Prelude> :m System.Time Prelude System.Time> つぎに、現在の日付と時刻を getClockTime 関数で取

    System.Time モジュールの使い方 | tnomuraのブログ
  • Haskell の printf デバッグ | tnomuraのブログ

    手続き型言語でプログラムを作るときには、プログラムのあちこちに変数の値を印刷する printf 文を入れておくとどこでバグが発生しているのかを見つけるのに便利だ。 Haskell では入出力関係の関数は IO モナドの中でしか使えないので、手軽に print 関数を挿入して変数の値をチェックするなどということはできない。 しかし、純粋関数のプログラムの場合も中の様子を知りたい時がある。そこで、Haskell で無理やり printf デバッグをするにはどうすればいいか試してみた。 まず、最初に簡単な Haskell のプログラムの代表として、階乗のプログラムを作ってみた。 fact 0 = 1 fact n = n * fact (n-1) このプログラムは問題なく動く *Main> fact 5 120 そこで、fact の the recursive case の n の値を毎回プリン

    Haskell の printf デバッグ | tnomuraのブログ
  • 1