タグ

haskellとHaskellとモナドに関するigrepのブックマーク (25)

  • GHC IO モナドの中身

    Haskell の IO モナドって,中身どうなってたんだろと気になってて,ちょっと調べてみた.そのメモ. IO モナドと RealWorld まずは基から. IO モナドは, Haskell の根幹となるモナドで, main も IO で書く. GHC では中身は次のように定義されている [1]: -- In GHC.Types module of ghc-prim package newtype IO a = IO (State# RealWorld -> (# State# RealWorld, a #)) 見ての通り, IO a は State# RealWorld -> (# State# RealWorld, a #) の newtype だ.あんまり見慣れない State# RealWorld という型と (# , #) という型が出てきたけど, State# RealWo

    GHC IO モナドの中身
    igrep
    igrep 2019/05/18
    "このように, ST も IO と同じように特別なことはしておらず,既存の汎用的な仕組みを利用して,うまく実装されている"
  • Maybe と IO を一緒に使いたくなったら - ryota-ka's blog

    この記事は以下のページに移転しました. blog.ryota-ka.me たまには初学者向けにライトな話題を. 対象読者 すごいHを12章か13章ぐらいまでは読んだ do 構文を使って IO などの処理が書ける Haskell のプログラムはなんとなく書けるが,あまり綺麗に書けている気がしない IO の中で Maybe を使う 例として,以下のようなプログラムを考えてみよう. 2つの整数 a b を標準入力から1行ずつ順に読み込む a と b の和を標準出力に出力する 与えられた入力が整数でなかった場合には,その時点でエラーメッセージを出力し,プログラムを終了する これらの要件を満たすプログラムを素朴に実装するならば,以下のようになるだろう. import System.Exit (die) import Text.Read (readMaybe) readInt :: String -

    Maybe と IO を一緒に使いたくなったら - ryota-ka's blog
  • Selectionモナド入門 - Qiita

    Selectionモナドは2010年にEscardóとOlivaによって"Selection Functions, Bar Recursion, and Backward Induction"で紹介されました。継続モナドによく似ていますが少し違っており、ゲーム理論の解法の一つである後ろ向き帰納法や探索アルゴリズムなど色んなパターンを取り扱うことができます。transformersというよく知られたライブラリではControl.Monad.Trans.Selectというモジュールとして実装が提供されています。 Selectionモナドの型を見てみましょう。

    Selectionモナド入門 - Qiita
    igrep
    igrep 2019/04/05
    ずいぶん前にtransformersに追加された http://hackage.haskell.org/package/transformers-0.5.6.2/docs/Control-Monad-Trans-Select.html のことか。前から気になってた!
  • [Haskell] 爆速でモナドを理解する

    何番煎じか分かりませんが、爆速でモナドを説明します。比喩は使いません。 モナドのコンセプトはこの記事の半分ほどで説明し終わるので、残りはオマケです。 *Maybe, State, List, IO など、具体的なモナドの使い方は一切説明していません。 この記事で説明しているのは「モナドとは何か」だけです。 モナドを使いこなせるようになるためには、他の記事をあたって様々なモナドの使い方をひとつずつ覚えていくほかありません。 関数の結合 モナドの説明に入る前に、まず関数結合の演算子を定義しましょう GHCi> import Data.Function(flip) GHCi> let (>.>) = flip (.) GHCi> :t (>.>) = flip (.) (>.>) :: (a -> b) -> (b -> c) -> (a -> c) GHCi> let showSqrt = s

    [Haskell] 爆速でモナドを理解する
    igrep
    igrep 2018/10/17
    Kleisli圏における射の合成 (>=>)を使った説明をよく目にするようになった気がするなー。
  • モナド則とプログラミング - Qiita

    1. (return x) >>= f ≡ f x 2. m >>= return ≡ m 3. (m >>= f) >>= g ≡ m >>= (\x -> f x >>= g) 等号(≡)は置き換え可能であるという意味で読んでください。上から左単位元、右単位元、結合則と呼ばれます。 モナド則が満たされたモナドはプログラマにとって何が嬉しいのでしょうか。 端的に言ったらコードを分割/組み合わせ/抽象化等が出来るため、嬉しいのです。 もう少し言えば、モナド上では自然にプログラミング出来るから嬉しいのです。 もう少し言えば、モナド上でいつも通りエンジニアリング出来るから嬉しいのです。 モナド則のプログラミング上の意義とは、理解してしまうと当に当たり前になってしまいます。 三日後には嬉しさのことなど忘れてその当たり前のメリットを享受することでしょう。 そうして誰もHaskellのモナド則につ

    モナド則とプログラミング - Qiita
    igrep
    igrep 2018/07/06
    宣伝申し訳ないけど「モナド則が実際のプログラミングでどの様に関わっているのか」という意味では http://the.igreque.info/posts/2016/04-monad-in-java.html でもそこそこ詳しく触れていると思うので、読んで欲しいな!
  • The Comonad.Reader » The State Comonad

    Is State a Comonad? Not Costate or rather, Store as we tend to call it today, but actually State s itself? Let's see! Recently there was a post to reddit in which the author King_of_the_Homeless suggested that he might have a Monad for Store. Moreover, it is one that is compatible with the existing Applicative and ComonadApply instances. My knee-jerk reaction was to disbelieve the result, but I'm

  • Stateモナドで遊んでみよう - Qiita

    これはHaskellアドベントカレンダー2015の7日目の記事です。 「すごいHaskell楽しく学ぼう」を一通り読んだくらいの方が対象(のつもり)です。 導入 ネットの海を見渡してみると、沢山の人が様々なモナドチュートリアルを書いていますが、 よくわからない時は解説を色々読むよりも手を動かして、使い慣れてしまうのが結局早いと私は思っています。 というわけで、Stateモナドを題材にいくつか演習問題を提供してみようというのが当記事の趣旨です。 Stateモナドとはなんぞや ここではHaskellWikiの記事やHackageをベースに、Stateモナドの大ざっぱな使い方だけを解説します。 そんなもん知っとるわい! という方は「使ってみよう」までスキップしていただいて構いません。 また、「すごいHaskell楽しく学ぼう」を持っている方は、14.3項の解説を併せて読むとわかりやすいと思います

    Stateモナドで遊んでみよう - Qiita
  • モナドトランスフォーマー・ステップ・バイ・ステップ(Monad Transformers Step By Step) - りんごがでている

    著者のMartin Grabmüller氏に許可をいただきましたので、 Haskellモナドトランスフォーマーのチュートリアルを翻訳したものを公開します。 タイポや誤訳、プログラムのミス等ありましたら、 Twitter宛@bicycle1885かコメント欄までご連絡頂けるとありがたいです。 元のテキストやプログラムは以下のリンクから得られます。 Monad Transformers Step by Step [2012/12/19] 誤りを多数訂正しました。id:qtamakiさん、ありがとうございます。 [2014/6/19] 誤りを2点訂正しました。id:daimatzさん、id:hitotakuchanさん、ありがとうございます。 Monad Transformers Step by Step Martin Grabmüller Oct 16 2006 概要(Abstract) この

    モナドトランスフォーマー・ステップ・バイ・ステップ(Monad Transformers Step By Step) - りんごがでている
    igrep
    igrep 2015/10/14
    日本語版あったんだ!ありがとう!
  • モナド基礎勉強会 参加・LTしました + 【重要】発表内容の訂正 :: Igreque -> Info

    モナド基礎勉強会 参加・LTしました + 【重要】発表内容の訂正 by Yuji Yamamoto on March 23, 2015 3月21日土曜日、名古屋で行われたモナド基礎勉強会に参加し、LTしました。 後れ馳せながら感想記事です。 知ったこと やはり想像通りの難しさで内容の9割は理解できなかったように思いますorz 事前にLTのために初歩的な部分は理解したつもりだったので結構行けるかな、と思いましたが甘くないですねー。 そんな中でもふんわりと理解できたこととその印象を。(一部、@khibinoさんからアドバイスを元に得た理解もあります。) 圏論の基礎は全部読むんじゃなくてリファレンス的に持っておくといいそうですね!特に前書きは地雷らしい。 モナドが「モノイド対象」たるゆえんはjoinが結合則を満たすところにあるそうです。だからjoinはあんなに持ち上げられる 1のか… Freeモ

    igrep
    igrep 2015/03/23
    遅ればせながら感想エントリですっ!楽しい会をありがとうございました! #monadBase
  • モナドトランスフォーマーとその周辺 - Qiita

    モナドに関する記事は世の中に沢山ありますが、モナドトランスフォーマーに関する記事はあまりないように思います。その概念が意味する所はHaskell初心者はもちろんのこと、他の言語使用者も知っておいて損は無いと思います。 モナドトランスフォーマーとは、「モナド変換子」とも言いますが、モナドと組み合わせる事で、新しいモナドを生み出すことが出来るデータ構造の事です。 例えばモナドIO1とトランスフォーマーStateT sを組み合わせると、StateT s IOというモナドになります。組み合わせた結果がモナドなので、これもさらに他のトランスフォーマーと組み合わせる事も出来ます。そこでReaderT rを組み合わせてみます。すると、ReaderT r (StateT s IO)というモナドになります。さらにEitherT eを組み合わせると、EitherT e (ReaderT r (StateT s

    モナドトランスフォーマーとその周辺 - Qiita
  • Haskellでハトクラを表現する - haru2036のブログ

    この記事はHaskell Advent Calendar 17日目の記事です。 What is ハトクラ ハトクラとは、ドミニオンの変種みたいなカードゲームです。 ただし、カードの連結が続く限りカードをプレイできるというルールが加わっています。 こんな感じ …… ん……?連結……? これってモナドになりませんか?(これってトリビアになりませんか?的ノリ) そこで、今回はハトクラの一部(アクションフェーズ, またはメインフェーズ)を表現するモナドを作ってみようと思います。 やってみる これはおそらくStateモナドの変種みたいな感じで行けるのではと思いました。ただ、一番後ろのカードに連結マークがない(=もう連結できない)状態をどうにかして表現しないといけません。 まずはなんかと合成できないかと考えてみたりしてたのですが、何と合成しようかなあと考えてました。 @haru2036 残りアクション

    Haskellでハトクラを表現する - haru2036のブログ
  • モナド入門以前 - Qiita

    前書き これはモナドチュートリアルではない、だろう。 この文章を書く動機は、モナドを知らない人がモナドという未知の概念に期待しているものが根的にずれているかもしれないという懸念である。 命令型言語でプログラミングを覚えた人がモナド、もしくはHaskellや関数型言語(と言われる言語)を学習する際にしばしば受ける助言はこうだ: 「命令型言語で今まで習ったことを全て忘れて取り組むと良いよ」 この助言はそこまで外していないかもしれないが、雑である。 いつか僕の友人がこのようなことを言った: 「プログラマがチームで働く時、必要なのは相手を思いやる気持ちだよね」 この発言は恐らくそこまで外れてはいないが、思いやりで全てを解決しようとすると、全てのコストが非常に高くなる。個々の問題へ目を向け、それぞれの解法を知っておくことによってコストは低くすることが出来ると僕たちは知っている。まあ友人はそんなこと

    モナド入門以前 - Qiita
    igrep
    igrep 2014/12/17
    “Haskellはまだまだ発展途上だと思っていて、未だ使い途が見つかっていない数学オブジェクトがごろごろ転がっているHaskellを僕は本当にクールだと思っている。代数的性質が先に転がっているのだ...”
  • 絶対に理解出来ないモナドチュートリアル - konn-san.com

    世の中には、恐しい数のモナドチュートリアルがあって、それぞれモナドは象だとか、いや接ぎ木だ とか、プログラマブル・コンテナだとか、プログラム可能なセミコロンだとか、色々な説明がなされている。「モナド チュートリアル」で検索すれば、他にも色々に絵解きされた有象無象のモナドが大量に引っ掛かる。そうそう、モナドは単なる自己関手の圏におけるモノイド対象だよ。何か問題でも?なんてのもあったな。 この記事の目的は別に、こうした既存のモナドチュートリアルを「間違ってる!」とか「わかるわけねーよ!」といって貶そうという訳ではない。実際、既に幾多書かれているチュートリアルの中でも、僕の云いたいことと殆んど同じようなことが書かれているものは沢山ある。 では、上の膨大なリストの末尾にまた一つ「わかりやすい比喩」を付け足そうというのか?というとそういう訳でもない。そうそう、モナドは比喩ではないというチュートリアル

  • A Neighborhood of Infinity: You Could Have Invented Monads! (And Maybe You Already Have.)

    You Could Have Invented Monads! (And Maybe You Already Have.) If you hadn't guessed, this is about monads as they appear in pure functional programming languages like Haskell. They are closely related to the monads of category theory, but are not exactly the same because Haskell doesn't enforce the identities satisfied by categorical monads. Writing introductions to monads seems to have developed

    igrep
    igrep 2014/04/05
    Very similar to what I thought about monad. lucky.
  • Introductions to advanced Haskell topics

    Many people bemoan the sharp divide between experts and beginning Haskell programmers. One thing I've noticed is that "advanced" Haskell topics all have one thing in common: there exists only one good tutorial on that topic and only the experts have found it. This post is a collection of links to what I consider to be the definitive tutorials on these topics. Monads Monads are technically not an a

    igrep
    igrep 2014/04/05
    Really helpful! Thanks!
  • モナドとはモナドである - モナドとわたしとコモナド

    この記事を読む前に、絶対に理解出来ないモナドチュートリアルに一度目を通してみてほしい。モナドを理解していく上で、とても重要なことが書かれている。 改めて言おう、モナドはモナドだ。コンテナだとかプログラマブルセミコロンだという説明では、モナドのすべてを正確に表せるとは言い難い。では、モナドを過不足なく説明できる、モナド以外の言葉はあるのか? 実は、モナドを表現し、かつモナドで表現される言葉は存在する。その一つは手続きである。手続き型言語の「手続き」だ。 手続きとは何か 手続きは結果を持つ おおよそすべての手続きは何らかの結果を持つ。Haskellの()、C言語のvoid、PythonのNone、Rubyのnilなども結果の一種だ。結果が出ないとしたら、そのプログラムは停止しないか、途中で異常終了するだろう。 手続きには最小単位が存在する 処理系が扱っている以上、手続きが際限なく分解できるとい

    モナドとはモナドである - モナドとわたしとコモナド
    igrep
    igrep 2013/06/29
    あとでじっくり読むはず。
  • モナドの六つの系統[Functor x Functor] - モナドとわたしとコモナド

    モナドは「アクション」を表す抽象的な構造である。モナドは、Haskellにさまざまな概念に対する記述能力をもたらす。 モナドの基礎 return :: a -> m a: 純粋な値をモナドで包む。 m >>= f :: m a -> (a -> m b) -> m b: モナドmに包まれた値をfに渡し、その結果として現れたモナドを結合する。 固有アクション: それぞれのモナドに固有の方法でモナドを生み出す。 実行: モナドに包まれた値を、より根源的な形に還元する。 モナド則 モナドに以下の三つの制約を課すことによって、最低限度の記述能力を保証している。 return a >>= k == k a m >>= return == m m >>= (\x -> k x >>= h) == (m >>= k) >>= h より強い制約は、より強い力を生み出す。 モナドの分類 モナドは、以下の6つ

    モナドの六つの系統[Functor x Functor] - モナドとわたしとコモナド
    igrep
    igrep 2013/06/06
    カッコイイw
  • 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モナドを使ってみよう - モナドとわたしとコモナド
    igrep
    igrep 2013/05/11
    いつか理解しよう。せめて使い方だけでもじっくり読んで。
  • Functors, Applicatives, And Monads In Pictures - adit.io

    Written April 17, 2013 updated: May 20, 2013 Here's a simple value: And we know how to apply a function to this value: Simple enough. Lets extend this by saying that any value can be in a context. For now you can think of a context as a box that you can put a value in: Now when you apply a function to this value, you'll get different results depending on the context. This is the idea that Functors

    igrep
    igrep 2013/04/20
    気が向いたら読む。
  • 例題で比較する状態系のモナド - あどけない話

    金曜日に状態系のモナドを説明しないといけないので、例題を書いて比較できるようにしておきます。 呪文として、以下のモジュールを読み込んでおきましょう。 import Data.Char import Control.Monad.Identity import Control.Monad.Reader import Control.Monad.Writer import Control.Monad.State Identityモナド 入力が一つで、出力が一つのモナド。面白みはない。 i :: Identity Int i = do x <- return 2 y <- return 3 return $ x * y でも、モナドは Haskell の中に住むマイクロ言語で、このマイクロ言語でマイクロプログラムを作成した後は、run で実行するものだというイメージは分かるかも。 > runIde

    例題で比較する状態系のモナド - あどけない話
    igrep
    igrep 2013/01/20
    超わかりやしー