タグ

Monadに関するnotaeのブックマーク (48)

  • 確率とモナドと確率的プログラミング - Qiita

    この記事はADVANCED BEGINNERからCOMPETENTの方を対象読者として書かれています。 コインの裏表やサイコロの出目はよく確率変数によって表されます。確率変数が互いに依存しているようなモデルを記述する手法としてグラフィカルモデルと云うものがあります。例えば、ある分布に従って表が出る確率が偏ったコインが選ばれた後、そのコインを投げて表裏が決まるような実験を考えた場合、コインの確率変数を $X$, コインの表裏の確率変数を $Y$ とすると、この系を記述するグラフィカルモデルは このようになります。ところで $X$ は表が出る確率Double上の確率変数RVar Doubleで、 $Y$ は $X$ の結果に依存したコインの裏表Bool上の確率変数Double -> RVar Boolであると考えるとします。今コインがランダムに選ばれると言う構造を 忘れて コインの表裏が出る確

    確率とモナドと確率的プログラミング - Qiita
  • 快速のExtensible effects - モナドとわたしとコモナド

    extensibleは拡張可能レコードだけでなく拡張可能作用(extensible effects)も用意している。拡張可能作用は一時期Haskell界隈で話題になったものの、今では人気も下火になってしまった。新しいバージョンをリリースした今、拡張可能作用の動機と使い方について改めて紹介しよう。 難行の一次関数 Haskellでモナドをカスタマイズする方法としては、transformersのモナド変換子がよく使われている。モナド変換子は、モナドをパラメータとして取り、新たな能力を付与したモナドにする構造だ。例えば、StateT sはモナド変換子の一つである。任意のアクションm aはliftを使ってStateT s m aに変換できる。 newtype StateT s m a = StateT { runStateT :: s -> m (a, s) } 他にもReaderT, Write

    快速のExtensible effects - モナドとわたしとコモナド
  • Named extensible effects - School of Haskell | School of Haskell

    As of March 2020, School of Haskell has been switched to read-only mode. Monad transformers are the standard way to extend monads. The transformers package defines monad transformers. StateT, one of the representative monad transformers, has three parameters: newtype StateT s m a = StateT { runStateT :: s -> m (a, s) }The second parameter m allows you to add a new type of effect while preserving t

  • Notions of Computations and Effects - Just $ A sandbox

    前回のeffect systemに対するボヤキ、あるいは予言が色んな人に読まれたみたいなので興味がある人が一定数いるならeffect systemの紹介記事をちゃんと書こうと思った次第。 というわけでmonadを前提としてプログラミング言語的な見方と圏論的な見方を通してeffectに関するお話をしてみます。 注意 以下のプログラムはHaskellに寄せたオレオレsyntaxで実際にそういう実装があるわけじゃないので注意してください。実際の実装されている言語の話は最後に少しします。 programming with effects effectは通常type-and-effect-systemと呼ばれるようにある意味で一種の型システムのようなものです。型システムがプログラムの入力と出力の値を見積もる仕組みだったのに対し、エフェクトシステムはプログラムを実行した際に「起きうる」エフェクトをコン

    Notions of Computations and Effects - Just $ A sandbox
  • monadからeffectへ - Just $ A sandbox

    追記 もう少しまともなeffect入門記事を書きました myuon-myon.hatenablog.com この文章は今から5-10年後に万が一effect systemが流行り始め、今のHaskellのような立ち位置になった場合に備えて書いています。 effect systemについて Haskellはモナドを用いて純粋・非純粋を切り分けることができる言語で、computational effectを扱うために導入されたものだった。 かつては関数 A -> B で一緒くたにしていたcomputationは、 A -> T B と、文脈 T をもった関数として表現できるようになった。ところでこのようなcomputational effectとしてのモナドを言語機能に組み込むには2つの方法があって、 Meta Language方式 (Haskell) Programming Language

    monadからeffectへ - Just $ A sandbox
  • モナドモナド (LT没ネタ) - Qiita

    数学カフェのLTで話す予定でしたが、使う機会がなくなったので公開します。 Haskellにおけるモナドとは HaskellではMonadという型クラスでモナドを表現しています。この型クラスは return :: a -> m a 、 join :: m (m a) -> m a 、そして fmap においてモナドが表現されています。色んな人が色んな場で説明していることですから、今さらここで議論を掘り返す必要はないでしょう。 モナドには []、Maybe、State s、Cont r、Reader r、Writer w、IO、などがあります。しかし、みなさんはそれで満足でしょうか? そんなモナドで大丈夫ですか? Haskellでもっとモナド モナドをさらにこじらせた人は、 Free モナドや Codensity モナドなどに手を出すでしょう。これらは大変便利なものですが、その珍しさ故これまた

    モナドモナド (LT没ネタ) - Qiita
  • 今のところ比較的簡単なモナドの作り方 - モナドとわたしとコモナド

    準備 モナドを作るには、どんなモナドを作りたいか考える。モナドは一般に、どのようなアクションが使えるかによって特徴付けられる。その点ではオブジェクト指向におけるインターフェイスとよく似ている。 では、foo :: String -> M Boolとbar :: M Intという二種類のアクションを持つモナドを作るとしよう。まず、どんなアクションが使えるかを表すデータ型を定義する。 {-# LANGUAGE GADTs #-} data MBase x where Foo :: String -> MBase Bool Bar :: MBase Int GADT(一般化代数的データ型)の各データコンストラクタがアクションに対応する。GADTsを使ったことがなくても心配してはいけない。引数の型と結果の型に着目しよう。 モナドにする monad-skeletonをインストールする。 $ stac

    今のところ比較的簡単なモナドの作り方 - モナドとわたしとコモナド
  • モナドの実装いろいろ - Qiita

    モナドと一口に言っても内部実装色々あるので、同じ機能のモナドを色々な書き方で書いてみます。 要件 あまり複雑にしてもアレなので、State,WriterとIOの制約くらいにしておきます。 インスタンスはFunctor, Applicative, Monadのみ 内部にIntで0開始のカウンタと、DList Logで表現されるログを持つ incr :: Int -> DSL ()でカウンタを増減し、ログにI iを追加 reset :: DSL ()でカウンタを0に戻し、ログにRを追加 current :: DSL ()で標準出力に現在のカウントを出力。文脈内でそれ以外のIOは不可能とする runDSL :: DSL () -> IO (Int, [Log])でDSLを実行し、最後のカウンタの値とログを返す。 Logデータ型はこんな感じにして共通に使用し、

    モナドの実装いろいろ - Qiita
  • Freer Monads, More Extensible Effects

    PPL 2016 における講演。Haskell Symposium 2015 で発表した Kiselyov & Ishii の同名論文の解説スライド。

    Freer Monads, More Extensible Effects
  • freer-ppl16.key

    Freer Monads, More Extensible Effects PPL 2016
 岡山県玉野市 2016/03/08 Oleg Kiselyov Tohoku University Hiromi ISHII University of Tsukuba (Originally Published in Haskell Symposium '15) Table of Contents • Background: Monad Transformer • Extensible Effects • More Extensible Effects • Examples • Benchmarks • Conclusions Background Background モナド:関数型言語で命令的に副作用を記述する方法の一つ Background •問題:モナド(=副作用)の合成 モナド:関数型言

  • GHC 以外の処理系での IO 型/IO モナドの実装

    Haskell での IO 型/IO モナドの実装としては、現在 GHC で使われている World を状態として受け渡すやり方が有名です。ですが、GHC での実装が IO 型/IO モナドを定義するための唯一の方法というわけではありません。他の処理系では、GHC とはまた違った方法で IO 型/IO モナドの実装を行っています。(中には GHC と同じ方法を採用しているものもありますが。)というわけで、他の処理系での IO 型/IO モナドの実装についてまとめました。

    GHC 以外の処理系での IO 型/IO モナドの実装
  • Freeモナドを超えた!?operationalモナドを使ってみよう - モナドとわたしとコモナド

    限定版IOみたいなモナドを簡単に作れたら、コードが分離できるしテストもしやすくなるのになあ… 数か月前なら、 それ、Freeモナド*1でできるよ! と返されるだろう。だが今は違う。Freeモナドよりも簡単にモナドを作れるモナド、Operationalモナドがあるのだ。 Freeモナドについて復習しよう。FreeモナドはFunctorを基にMonadを作れる構造であり、Functorで自分自身を包むことによってモナドの力を得ている*2。FunctorそのものはDeriveFunctor拡張を使って簡単に作れる。 {-# LANGUAGE DeriveFunctor #-} import Control.Monad.Free data CharIO a = PutCh Char a | GetCh (Char -> a) | LiftIO (IO a) deriving Functor put

    Freeモナドを超えた!?operationalモナドを使ってみよう - モナドとわたしとコモナド
  • そろそろFreeモナドに関して一言いっとくか - モナドとわたしとコモナド

    Freeモナドはすごい。 Haskellを書いていて、「特殊化された処理を記述するモナドが簡単に作れたら便利だろうなー」と思ったことはないだろうか?簡単に作れるのである、そう、Haskellならね。 これが、純粋なFreeモナドの定義である。 data Free f a = Pure a | Free (f (Free f a)) instance Functor f => Monad (Free f) where return = Pure Pure a >>= k = k a Free fm >>= k = Free (fmap (>>=k) fm) (Functor、Applicativeのインスタンス宣言は自明なので省略) 与えられたFunctorをお互いに埋め込み合っている、という漠然とした印象で、何が嬉しいのかよくわからないかもしれない。だが、この単純さこそFreeモナドの便利

    そろそろFreeモナドに関して一言いっとくか - モナドとわたしとコモナド
  • Free and Freer Monads

    Introduction Classical monads Free Monad Profitable cheating Freer Monad Definitional interpreters for effects Performance Conclusions Introduction Writing Monad (and now, Applicative and Functor) instances and making sure the monad laws hold are a big part of defining a monad and even a bigger part in exponentially procreating monad tutorials. We argue that all these instances are boilerplate --

  • 無限ループから抜け出すプログラム - Qiita

    Haskell は簡単に無限ループを作れる。 もちろん他の言語でもwhile(1)とすれば簡単に作れるけど、じゃあその無限ループから脱出するbreakに相当する機能をHaskellでも作れるだろうか。 (`・ω・´) 実際に作ってみた。 import Control.Monad.Cont main :: IO () main = do putStrLn "Start" withBreak $ \break -> forM_ [1..] $ \i -> do liftIO . putStrLn $ "Loop: " ++ show i when (i == 5) $ break () putStrLn "End" where withBreak = flip runContT pure . callCC

    無限ループから抜け出すプログラム - Qiita
  • https://okmij.org/ftp/papers/DDBinding.pdf

  • vty + StateT で画面のスクロールを実装する - ryota-ka's blog

    この記事は CAMPHOR- Advent Calendar 2015 4日目の記事です. こんにちは,@ryota-ka です.今年もアドベントカレンダーの記事がやって参りました. 今回の記事では,ncurses を使ってターミナル上でフルスクリーンアプリケーションを作成し,ユーザーのキー入力を受け取って画面のスクロール機能を実装します.スクロールのオフセットは State モナドで管理することにしましょう. TL; DR Haskell で ncurses を触る際には vty が便利 複数のモナドを同時に扱いたい時にはモナド変換子を使おう ソース GitHub に上がってます ncurses と vty について ターミナル上でフルスクリーンで動作するアプリケーションはよくあります.例を挙げると,tig, sl, twterm, chikubeam などなど.こういった挙動を実現する

    vty + StateT で画面のスクロールを実装する - ryota-ka's blog
  • Purescript with Monad

    Learning Deep Architectures for AI (第 3 回 Deep Learning 勉強会資料; 松尾)Ohsawa Goodfellow

    Purescript with Monad
  • http://wwwhome.cs.utwente.nl/~jankuper/fp-dag/pref.pdf

  • Monad tutorial

    ESPM2 2018 - Automatic Generation of High-Order Finite-Difference Code with T...Hideyuki Tanaka

    Monad tutorial