タグ

continuationに関するnsyeeのブックマーク (33)

  • なぜPlayのコントローラで継続モナドを使うと便利なのか?

  • 継続モナドによるリソース管理 - Qiita

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

    継続モナドによるリソース管理 - Qiita
  • GitHub - lambdataro/fly2: fly2 は限定継続を実験するためのプログラミング言語です。

  • マクロと限定継続

    限定継続(shift/reset)shiftはresetまでの継続をとる (reset (+ (shift k (k 1)) 2)) ; => 3 ; k = (fn [x] (+ x 2)) 実装shiftは継続コンテキストを返す resetはcallによる継続渡し形式に変換 callは継続を適用する (macroexpand (quote (reset (+ (shift k (k 1)) 2)))) (cont.core/call + (fn* [G__3646] (cont.core/call (new cont.core.Context (fn* [k] (k 1))) (fn* [G__3647] (cont.core/call (G__3646 G__3647 2) (fn* [G__3645] G__3645)))))) 例非決定性計算 (defn amb [& xs] (

  • Coqでcall/cc(Coqで継続モナド、その2) - Qiita

    2014_05_17 @suharahiromichi 2014_05_18 @suharahiromichi 「証明」の部分を見直した 継続モナドの続きとして、前回(文献1.)にも定義してあったcall/ccを使ってみる。例題は今回も文献2.からいただいています。 資料のソースコードは以下にあります。 https://github.com/suharahiromichi/coq/blob/master/ssr/ssr_monad_callcc.v Definition MCont R A := (A -> R) -> R. Definition bind {R A : Type} (c : MCont R A) (f : A -> MCont R A) : MCont R A := fun (k : A -> R) => c (fun (a : A) => f a k). Defini

    Coqでcall/cc(Coqで継続モナド、その2) - Qiita
  • Coqで継続モナド - Qiita

    2014_05_15 @suharahiromichi 2014_06_01 @suharahiromichi Classを使用して定義しなおした。 モナドと継続の話を一度で片付けてしまおうと思う。継続モナドについて解説したページは多いけれど、大部分がHaskellであるから、Coq SSReflect で書いてみた。もっとも、資料の内容もHaskellについて解説した文献2.を多く参考にさせていただいた。 また、フィボナッチ関数の証明は文献3.のCoqによる証明をSSReflectに修正したものである。 Coqのモナドのパッケージは文献1.にあるが、これは使用していない。ただし「>>=」演算子の優先順位はあわせた。 資料のソースコードは以下にあります。 https://github.com/suharahiromichi/coq/blob/master/ssr/ssr_monad_c

    Coqで継続モナド - Qiita
  • sweet.jsでshift/reset: 限定継続を使ってコールバック地獄から抜け出す - 標高+1m

    Stop Writing JavaScript Compilers! Make Macros Insteadを読んで、sweet.jsを使ってみた。 解決したい事 JavaScriptでは非同期処理が多いので、継続渡しスタイルのコードばっかりになるのだけど、みんなこれをcallback hellとかpyramid of doomとか呼んで嫌っている。 そこでプロミスとかフューチャっていうのが使われるようになった。プロミスを使う利点は結果が出ていない状態をファーストクラスな値として使える事だと思う。ネストはなくなるけど、結局文法の支援がないからpromise.then(function () {...})みたいに、限定継続渡し的なことはしなくちゃいけない。 継続渡し形式が嫌ならcall/ccとかshift/resetを導入したらいいんじゃないかとはずっと思っていた。そこで今日は、sweet.

    sweet.jsでshift/reset: 限定継続を使ってコールバック地獄から抜け出す - 標高+1m
  • logict

    Adapted from the paper Backtracking, Interleaving, and Terminating Monad Transformers by Oleg Kiselyov, Chung-chieh Shan, Daniel P. Friedman, Amr Sabry. [Skip to Readme] Downloadslogict-0.8.1.0.tar.gz [browse] (Cabal source package)Package description (revised from the package)Note: This package has metadata revisions in the cabal description newer than included in the tarball. To unpack the packa

  • OchaCamlに触ってみた。 - claustrophobia

    PPL2014( http://www.fos.kuis.kyoto-u.ac.jp/ppl2014/ )に参加して来ました。 去年に引続きの参加(但し去年は発表なしで見に行っただけ)だったのですが、去年も今年も(主にお茶女勢による)限定継続の発表を聞いては「限定継続ってなんだっけ」と思ってはググったり、教えてもらったりしていましたので、いい加減ちょっとは学んでおこうと思い、OchaCamlを入れて遊んでみました。 公式ページ通りにインストールしてみます(OSはUbuntu)。tarを落として cd ~/Project/OchaCaml tar xpfvz cl75unix.tar.gz tar xpfvz OchaCaml.tar.gz patch -p0 < OchaCaml/OchaCaml.diff cd cl75/src make configure と、ここでエラー。 gcc:

    OchaCamlに触ってみた。 - claustrophobia
  • OchaCaml: shift/reset-extension of Caml Light

    OchaCaml: shift/reset-extension of Caml Light September 16, 2017 What is OchaCaml OchaCaml is a Caml Light system extended with delimited control operators, shift and reset. It supports the let-polymorphic type system with answer type modification. Added Features reset (fun () -> M) Delimit the context of M. shift (fun k -> M) Clear the current delimited continuation, bind it to k, and execute M.

  • モナドをつくろう

    函数プログラミングの集い 2012 in Tokyo 発表スライド 継続については『簡約!? λカ娘(算)』 http://www.paraiso-lang.org/ikmsm/books/c82.html の「オール・アバウト・ケイゾク・イン・スキーム」を読むといいんじゃなイカ?Read less

    モナドをつくろう
  • CPSで実装したモナドは何故速いのか - Mizon Dev Diary

    2014-01-20 CPSで実装したモナドは何故速いのかモナド変換子の速さを測ってみる - モナドとわたしとコモナドCPSでモナドを実装すると速くなるらしい。以前、その理由について考えてみたのだが、結論に達しなかった。そこで、続きを書く。まず、Twitterである方に教えていただいたのだが、CPSで実装したモナドは、非CPSで実装したモナドに比べて次の2点の理由により高速であるという。データの生成/分解が抑えられるから合成時に継続を破棄できるからどういうことなのだろうか。Maybeモナドを例として以上の2点を確認したい——。と、確認したかったのだが、検証したところ、1点目については結論を得たものの、2点目については「速くならない」という矛盾した結論が出てしまった。そこで、以上の1点目についてのみ検証した記録をつける。非CPS版Maybeモナドまず、非CPS版のMaybeモナドの定義は以下

  • GHCで動くcall/ccの実装 - www.kotha.netの裏

    IOモナド上で動作するcall/ccを実装できることが分かったので書いておく。ただし実用に耐えるものではない。 これを使うとたとえばこういうコードを書くことができる。 import Control.Applicative import Control.Monad import Data.IORef import System.IO.Unsafe import Continuation (callCC, withContinuationsDo) test :: IO () test = do r <- callCC $ \cc -> return $ Right $ cc . Left case r of Left val -> do putStrLn $ "left: " ++ show val return () Right cc -> do putStrLn "right" cc "f

    GHCで動くcall/ccの実装 - www.kotha.netの裏
  • NECがビッグデータの機械学習を高速化する技術を開発、インメモリー処理やMPIを導入

    NECは、ビッグデータ分析を高速化する分散処理フレームワーク「Feliss」を開発した(発表資料)。ビッグデータ分析でよく用いられるHadoopは、Map-Reduce型の単純な分析であれば高速に実行できるが、繰り返し演算を多用する機械学習処理では、ジョブ間でストレージを経由してデータをやり取りするHDFSがボトルネックとなり、演算の効率を上げにくい。 そこでNECのFelissでは、ジョブ間のデータのやり取りをインメモリーで実施するようにした。さらに演算ノード間の通信などにおいて、並列処理の際のメッセージパッシングのAPIとして一般的な「MPI」を同時に使えるようにした。これにより、機械学習のような複雑な演算について、通常のHadoopを用いる場合と比べて10倍ほど高速に実行できるようにした。FelissはHDFSのインタフェースを備えており、最初のデータ読み出しはHDFSから行える。

    NECがビッグデータの機械学習を高速化する技術を開発、インメモリー処理やMPIを導入
  • Scheme:使いたい人のための継続入門

    使いたい人のための継続入門継続渡し形式call/ccは普通の関数call-with系関数call-with-procedurecall-with-continuation-procedurecall-with-current-continuation評価順序と継続call/ccパズルお手元マルチスレッド部分継続reset/pcとcall/pc環境破壊と部分継続部分継続の使用法PRINT-AND-NEXT-REPL議論質問お手元マルチスレッドのサンプルプログラムについて 使いたい人のための継続入門 とりあえず殴り書き。 くどかったり冗長な文章になってたり、重複してたり、間違ってたり、 おおいなる勘違いをしてたり、恥をカいてたりするかもしれないけどご愛敬。 藁をもつかみたい気持ちで継続を使えるようになりたい人は読んでみてください。 ただし所詮は藁です。(w 継続渡し形式 例によって階乗fact

    Scheme:使いたい人のための継続入門
  • Island Life - 継続の起源

    About 南の島のプログラマ。 たまに役者。 Practical Schemeの主。 WiLiKi:Shiro 最近のエントリ 無限cxr高校受験Defense振り返ってみると2019年は色々学んで楽...覚えるより忘れる方が難しい(こともある)眼鏡のつると3DプリンタIris Klein Acting ClassSAG-AFTRA conservatory: Voice Acting創作活動って自分を晒け出さねばならないと...ループを使わずに1から100までMore... 最近のコメント shiro on 歳を取ると時間が速く過ぎるのは、新しいことに挑戦しないから? (2023/03/14)1357 on 歳を取ると時間が速く過ぎるのは、新しいことに挑戦しないから? (2023/03/01)ベアトリーチェ on ハイポハイポハイポのシューリンガン (2022/04/02)ベアトリーチ

    Island Life - 継続の起源
  • Island Life - 継続の起源

    About 南の島のプログラマ。 たまに役者。 Practical Schemeの主。 WiLiKi:Shiro 最近のエントリ 無限cxr高校受験Defense振り返ってみると2019年は色々学んで楽...覚えるより忘れる方が難しい(こともある)眼鏡のつると3DプリンタIris Klein Acting ClassSAG-AFTRA conservatory: Voice Acting創作活動って自分を晒け出さねばならないと...ループを使わずに1から100までMore... 最近のコメント shiro on 歳を取ると時間が速く過ぎるのは、新しいことに挑戦しないから? (2023/03/14)1357 on 歳を取ると時間が速く過ぎるのは、新しいことに挑戦しないから? (2023/03/01)ベアトリーチェ on ハイポハイポハイポのシューリンガン (2022/04/02)ベアトリーチ

    Island Life - 継続の起源
  • Ruby に callcc を公式にサポートさせよう - まめめも

    Ruby の callcc というと、 現在の Ruby の Continuation は欠陥品で、まともに利用できないシロモノです。具体的には、dynamic-wind 相当の機能がありません。 (略) ちなみに、dynamic-wind 相当の機能を入れるのは、拡張ライブラリを全部 callcc safe にする作業に相当しますので、現実的じゃないんじゃないかなぁ、と思っています。 ruby-dev:30988 という話があって、「そっかー欠陥品なのかー」「直すのも難しいのかー」と悲しんでいました。 が、dynamic-wind を実装するだけなら広範囲の修正は不要なことに気がつきました。つまり直すのは簡単。というエントリ。 その前に: dynamic-wind とは dynamic-wind とは、継続呼び出しで指定した範囲に突入したり脱出したりするときに起動するハンドラを設定する関

    Ruby に callcc を公式にサポートさせよう - まめめも
  • CPSチェイン - keigoiの日記

    追記:「東京Node学園#1「非同期プログラミングの改善」のエッセンス」というスライドで、似たようなテクニックが使われているのを見た(p.32-)。 そんなにスジは悪くないのかもしれない。 JavaScriptでは非同期的に関数を呼ぶことが多い。例えばimgタグのロードが終わったら次にAを処理して、それが終わったらBをして…など。 こういうときCPS形式でプログラムを書くはめになる。 func1(arg1, function(res1){ func2(arg2, function(arg3, res2){..})}) かようにJavaScriptでは関数リテラルがすこぶる扱いづらい -- 'function' とか 'return' とか {} のネストとか…あとカリー化するにも一苦労 -- JavaScriptプログラマはどう書くんだろう? こういう非同期呼び出しをうまく同期的に記述する

    CPSチェイン - keigoiの日記
  • 2004-10-02

    最近C++を使う時間が長いのでががーっと C++批判文章を書き上げてみる…。 (注:以下の文章において、C言語とはC/C++をさすものとお考えください) gotoは今から30年以上も前のダイクストラ先生による撲滅運動の 甲斐もあってかどうなのか、今日では良くないものの代名詞のように なっている。良くないということの主な理由はプログラムの流れが 見えにくくなる、等のようなのだが、実際のところどの程度のものかは よく分からない。C言語において、例えばループ構文を使わずにすべてを gotoでまかなおうとするとこれはほとんど自明に、確かに大変である。 例えばfor文なら、 for (A;B;C) body というものは、これを形式的に A _continue_for: if (B) goto _break_for; C goto _continue_for; _break_for:; このように変

    2004-10-02