タグ

ブックマーク / hiratara.hatenadiary.jp (11)

  • 今日は Haskell Day 2019 の日です - Pixel Pedals of Tomakomai

    咳が止まらない状態で非常に厳しいですが、来ていますので、自分用のメモを残しておきます。 関数型(function type)を見つめるプログラミング / 山下さん 関数の型、 Haskell では第一級 リスト型 a が型なら [a] も型 タプル a b が型なら (a, b) も型 タプル a b が型なら a -> b も型 a が domain 、 b が codomain 高階関数型 domain が関数 (a -> b) -> c codomain が関数 a -> (b -> c) こちらは意識されにくい 2変数関数 (a, b) -> c Haskell 以外でもよく使う セクション (+) は高階関数 a が domain、 b が codomain 逆に、 codomain が関数の高階関数は 2 項演算子 f: a -> a -> a `f` curry :: ((a

    今日は Haskell Day 2019 の日です - Pixel Pedals of Tomakomai
    xef
    xef 2019/11/13
  • 今日は Regex Festa の日です - Pixel Pedals of Tomakomai

    今日は Regex Festa の日です Regex Festa に来ていますので、自分のためのメモを残しておきます。 挨拶 wi-fiとお手洗い、喫煙所の案内 Opt Technologies さんについて QRコード読むとアンケートあります いろいろな正規表現、いろいろなオートマトン / @sinya8282 さん 正規表現は好きだが、難しい面も面白い面もある 学部の頃は世界最速のgrepを書いてたりした 院では学術よりな研究 Shibuya.pm#16 が正規表現オンリーなイベントだった 東京素晴らしい! 8年の時を経て復活 正規言語の魅力 オートマトンという単純な計算モデル 台数モデル、トポロジー、論理、文法、最小不動点、といった多用な特徴づけ いろいろな道具が使える 効率的なマッチングにオートマトンやモノイドは役に立っている 正規表現は難しい 曖昧性とキャプチャ 講義ではオートマ

    xef
    xef 2019/11/04
  • 自由モナドの定義であるところの Control.Monad.Free.Church.foldF - 北海道苫小牧市出身の初老PGが書くブログ

    圏論勉強会の資料 によれば、 と自由な構成 について、 を与えると が得られるとある。 自由モナドの文脈でこれを考えると、関手 からモナド (の構造を忘れて関手と思ったもの)への自然変換を定義すれば、自由モナド からモナド への自然変換(正確にはモナドモーフィズム)が得られるという意味となる。 free パッケージにこの対応関係に相当するものは入ってないのかなと探してみたら、 Control.Monad.Free.Church というモジュールで定義されていた。 foldF :: Monad m => (forall x. f x -> m x) -> F f a -> m a The very definition of a free monad is that given a natural transformation you get a monad homomorphism. ht

    自由モナドの定義であるところの Control.Monad.Free.Church.foldF - 北海道苫小牧市出身の初老PGが書くブログ
    xef
    xef 2017/06/22
  • 関手圏からHaskへの関手 - Pixel Pedals of Tomakomai

    こんな感じでいいのかな。 class HFunctor hf where hfmap :: (Functor f, Functor f') => (forall t . f t -> f' t) -> hf f -> hf f' 以下は、型bを固定した時に定義できる関手F_bで、Functor fを型f bに移すような関手の定義。 data FunctorB b g = FunctorB (g b) deriving (Eq, Show) instance HFunctor (FunctorB b) where hfmap nat (FunctorB x) = FunctorB (nat x) 例えば、以下のようなMaybe関手からList関手への自然変換。 maybeToList :: Maybe a -> [a] maybeToList Nothing = [] maybeToList

    関手圏からHaskへの関手 - Pixel Pedals of Tomakomai
    xef
    xef 2013/11/24
  • I/Oストリーミングライブラリの実装の基礎 - 後編 - Pixel Pedals of Tomakomai

    前回の続きである。予告通り、2つのストリーミングの「出力」と「入力」をつなげる処理、そして、ストリームの命令列を解釈する処理系を実装する。 2つのストリームを1つにする(考え方) 「出力」と「入力」をどうくっつけるといいのか。それぞれのストリームは命令の列なので、2つの命令の列があると考えられる。ちょっと考えると、これらをうまく並べ替えることで、1つの命令の列を作れることがわかる。 例えば、「Notify(1), Wait(2), Done(3)」という列の出力を、「Wait(4), Notify(5), Done(6)」という2つの列の入力につなぐことを考えよう。様々な処理をつなげる場合、取り出したい演算結果は下流で生成されると考えられるだろう。そこで、合成後の命令の列は下流のWait(4)から開始される。Wait(4)では上流からのデータを期待するので、次は上流の命令であるNotify

    I/Oストリーミングライブラリの実装の基礎 - 後編 - Pixel Pedals of Tomakomai
    xef
    xef 2013/10/30
  • I/Oストリーミングライブラリの実装の基礎 - 前編 - Pixel Pedals of Tomakomai

    conduitやpipesなどのストリーミングライブラリの実装は結構わかりにくい。Pipes to Conduitsという一連のエントリが分かりやすい解説なのだが、それでも序盤からFunctorやFreeモナドを駆使していてハードルが高めな印象を受ける。 理解するには自分で実装するのが一番の近道だろうから、このエントリでごく簡単なストリーミングライブラリを実装してみよう。ストリーミングライブラリではI/Oを扱うのが目的であるため、来であればモナドを扱えるように実装しなければ意味がないのだが、ストリーミングの基的な仕組みとしてはモナドは重要ではないので、ここでは純粋な値のみを扱うストリームを作成する。 ストリームを表す型 ここが一番重要かつわかりにくい部分だと思われる。今回の実装では、「入力」「出力」「結果」の3つの型をストリームで利用する。が、「出力」と「結果」の違いとはいったいなんな

    I/Oストリーミングライブラリの実装の基礎 - 前編 - Pixel Pedals of Tomakomai
    xef
    xef 2013/10/29
  • 今日は「データベースは圏なんだよ!の会」の日です - Pixel Pedals of Tomakomai

    中原市民館に来ております。データベースは圏なんだそうです。SGL読書会の姉妹イベントです。 Databases are categories by Spivakさん / @bonotakeさん Spivakさんのスライドの解説です。 情報の世界の coherence の欠如を解決するためにフレームワークが必要 数学 → 強力な言語。関数型言語、λ計算、ツリーやグラフ、RDB 圏論で情報をモデル化できる 圏はデータベースのスキーマ。モデルは関手。 圏と計算機科学は近いもの 圏とは Ob、Arr、s(ource)、t(arget)、p(rimary = identity) 圏の例: Set、Hask、A monoid 関手の例: 恒等関手、潰す関手、Hask → Set、単純な例、Set→Cat M-Set : M → Set という関手。m : S → S をactionと呼ぶ 有限状態オー

    今日は「データベースは圏なんだよ!の会」の日です - Pixel Pedals of Tomakomai
  • 擬リスト - Pixel Pedals of Tomakomai

    最近関数プログミラング入門を読んでるのだけど、擬リストって概念が新鮮だったのでメモ。 関数プログラミング入門 ―Haskellで学ぶ原理と技法― Richard Bird 山下伸夫 予備知識 擬リストの話をするのに必要な概念がボトムとか正格性とか。ボトムとは値の1つで、エラーとか無限ループとか、プログラムの結果を出力できない状態を表す。Perlで言えばdieとかwhile (1) {} とかだと思えばよい。これを⊥で表す。Haskellではundefinedと書く。 「関数fが正格である」とは、f ⊥ = ⊥であることを言う。これは値渡しな簡約をするLLではごく当たり前のことで、引数の式がエラーであればfを呼び出すまでもなくエラーが発生するという意味だ。「関数fが正格ではない」という状態は値渡しではなく遅延評価によって簡約する言語で初めて登場する。 ちなみに⊥はエラーとか無限ループなので、

    擬リスト - Pixel Pedals of Tomakomai
    xef
    xef 2013/01/02
  • 命令型言語Haskell - Pixel Pedals of Tomakomai

    ※これはHaskell Advent Calendar 2012の12/12分の記事です。 こんにちわ、Perlのプログラマの@hirataraです。関数型言語はまともに使ったことがないので、命令型言語の話を書きます。 Haskellでのふつうの"関数" Haskellは純粋関数型言語なので、例えば、add1 :: Int -> Intのような型の関数で副作用を発生することはできません。ここでいう副作用とは、ログを出力したりネットワークにアクセスしたりといったoutputだけではなく、ファイルを読み込んだり環境変数を参照するといったinputも含みます。add1は数学の関数と同じように振る舞います。もっときつい言い方をすれば、add1は単なる辞書(Dictionary or Map or HashTable, etc.)のように、キーに対して決まった値を返すような働きしかしません。(ただし

    命令型言語Haskell - Pixel Pedals of Tomakomai
    xef
    xef 2012/12/13
  • MonoidもMonadもモノイドだって話 - Pixel Pedals of Tomakomai

    わかめのモナド浸しと第6回 スタートHaskell2で「モナドは単なる自己関手の圏におけるモノイド対象だよ。何か問題でも?」という話をしてきた。スライドは以下。 モナモナ言うモナド入門 *1 モナモナ言うモナド入門.tar.gz .tar.gz の方はHaskellでの説明だったので、検証用コードも書いてみてgistに上げてる。QuickCheckとか使わずに値一個与えてみてるだけだけど、型が通ることくらいは確認できるかと。以下、検証用コードについて解説する。 MonoidはHaskの圏のモノイド まず、Monoidの方。図式はスライドを見てもらうとして、ソースは以下。満たすべきは各図式の時計回りと半時計回りが等しいことであり、具体的には、モノイドであれば clockwiseX == anticlockwiseX である必要があるという意味である。 assoc :: ((a, b), c)

    MonoidもMonadもモノイドだって話 - Pixel Pedals of Tomakomai
  • PerlによるFreeモナドの実装 - Pixel Pedals of Tomakomai

    悟りを開けると話題のFreeモナドをPerlで実装した。実装はこちら。 Freeモナドとは? モナドの性質の1つとして、flatten : TTX → TX (または join、またはη)によって重複する関手Tを1つに押しつぶせるという点がある。そのお陰で、TTTTTTXのようにTが複数ある型は考える必要がなく、XとTXという2つの型に限定して計算を考えることができる。が、モナドではない一般の関手Fではこの操作ができない。 じゃあこの操作を普通の関手でもできるようにしてやろうということを考えると自然とFreeモナドが構成できる。直和が定義できる圏であれば、自由モノイドを作るのと同じ要領でモナドを作ればよい。具体的には、関手を適用しない型、1回適用した型、2回適用した型、・・・*1のすべての直和をとる。つまり、TX = X + FX + FFX + FFFX + ... のような関手を作るこ

    PerlによるFreeモナドの実装 - Pixel Pedals of Tomakomai
    xef
    xef 2012/10/16
  • 1