これは、Typesafe 社の Director Professional Services である Heiko Seeberger 氏による「Introduction to Category Theory in Scala」の翻訳文です。誤訳、誤記などがありましたら、 日本Scalaユーザーズグループの「圏論入門 レビューのお願い」トピックに投稿していただくか、@quassia88 にご連絡ください。 もし君が僕みたいに、以前はJavaディベロッパーで、Scalaのファンになったばかりなら、君は多分遅かれ早かれ、モナドやら関手やらの、圏論の分野からやってきた謎に遭遇するだろう。そういった未知の概念は、君を、自分が恐ろしくまぬけなんじゃないか、という気分にさせることだと思う。もし君がそういう概念に既に親しんでいるなら、時間を無駄にすることはない、すぐにこのページを閉じてほしい。もしそうでな
以下のfumievalさんの記事に遅れること約2年・・・、ついにScala界隈にも、究極のモナド(?) Idealモナドが誕生した。 究極のモナド「Idealモナド」を垣間見る 究極のモナド「Idealモナド」を垣間見る(続/その0) 下のほうにその実装と、とりあえずIdealモナド経由でTrampolineを作って動かしてみた例を貼っておく。 ポイントは、単純なHaskellからの完全直訳ではなく、scalaz.Freeと同じようにGosubを作ったことにより、おそらくstack safeになった*1ことである(30を超えるフィボナッチが動くので、たぶん) だがしかし、そもそも抽象化されてるのか、というかFreeではなくIdealにすることによる実用的な嬉しさが全く見えてないのと、かなり簡易的に計測しただけでも、Ideal版のTrampolineによるフィボナッチがscalaz.Free
The document discusses making programs free using free monads. It introduces the concept of Free[S, A] as representing a program as a value of a particular type A. It demonstrates usage of Scalaz's Task type and shows how programs written with free monads can be compiled down to a lower-level language. The document encourages viewing a real-world example using the Quasar library and provides conta
今回試したバージョンは7.1のFreeだ。 Freeとは何だろうか。 Functorと組み合わせて様々な挙動を実現できるモナド。 Freeモナドって何なのさっ!? Freeの説明は探せば結構出てくるが、どの説明も共通しているのが、 独自のデータ型にFunctorを定義する。 Freeを実行するインタープリタを定義する。 この2点だ。 使ってみる 意味が分からないと思うので、実際に使ってみよう。 まずは型の定義から。 trait Command[+A] case class Cd[A](path: String, next: A) extends Command[A] case class Ls[A](next: A) extends Command[A] case class Done() extends Command[Nothing]
At Iterators we’ve had many ideas on how to build a well-structured REST application and we are constantly searching for improvement and better ways to get the job done. Recently we built a system centered around free monads. We want to share this bit of knowledge in the hope that you’ll find it inspiring, or maybe show us how to do it better. While there are lots of tutorials on Free itself, we d
Extensible Effects in Scala Freer Monads, More Extensible Effects で紹介される Eff モナドを Scala を使って解説します。 Contents Free Monad Freer Monad Efficient Freer Eff Monad (Extensible Freer) Free Monad Free はパラメータに Functor のインスタンスを与えることでモナドになるデータ型です。 Functor の定義から見ていきましょう。 trait Functor[F[_]] { def map[A, B](fa: F[A])(f: A => B): F[B] } 計算コンテナ F に対して map という関数が定義されます。 map は F[A] の計算値 A に関数 A => B を適用し F[B] を得ます。
某会社の某アカウントシステムで使われているという継続モナドコントローラーですが、 今までいまいちよくわかっていなかったのですが友達に教えてもらってなるほど!と思ったので書き記します。 ActionCont 継続モナドコントローラー(ActionCont)については以下の記事で解説されています。 なぜPlayのコントローラで継続モナドを使うと便利なのか? PlayFramework - 継続モナドを使ってWebアプリケーションのコントローラーを自由自在に組み立てる - Qiita 本記事では「継続 = 何か残りの処理が呼べるやつ」という雑かつ不正確な認識でもActionCont便利じゃん!使ってみよ!と感じられることを目指すので、なんとなくの概要が頭に入っていればよい(はず)です。(なので、ActionContのメリットなどがもうわかってる人にとっては当たり前じゃん?みたいな内容です) Sc
よりよい実装を作りました。 → http://qiita.com/yyu/items/bd6e205e801fb653a9cc はじめに ActionContとは継続モナドCont[R, A]の型AにPlayのコントローラーの結果を表す型Resultを組み合わせたCont[Future[Result], A]のことである。このActionContは継続モナドの力を用いて柔軟にコントローラーを合成するために用いられる。この記事ではまず、このActionContについて軽く紹介した後に、既存のActionContではカバーできない点について言及し、それを解決するために今回作成したActionCont.recoverWithについて説明する。 ActionContとエラー処理 ActionContとは“継続モナドを使ってWebアプリケーションのコントローラーを自由自在に組み立てる”で導入された継
継続モナドを使ってPlay FrameworkのActionを作るという話をします。 Play FrameworkはScalaのWebアプリケーションフレームワークであり、Actionはそのコントローラー部分になります。 この記事を読むにあたって継続モナドの知識は前提としませんが、 ある程度のモナドの知識(Scalaのfor構文の使い方、ScalaのモナドがflatMapメソッドで合成できることなど) Play Frameworkの使い方(PlayのActionがどのようなものであるかなど) などの知識は前提とし、説明を省略させていただきます。 話の流れとしては以下のようになります。 コントローラーで継続モナドを使いたい動機 継続モナドとは? なぜコントローラーで継続モナドを使うと便利なのか? 継続モナドとFutureを組み合わせることでエラー処理を整理する 継続モナドを使ったAction
Extensible Effects in Scala Freer Monads, More Extensible Effects で紹介される Eff モナドを Scala を使って解説します。 Contents Free Monad Freer Monad Efficient Freer Eff Monad (Extensible Freer) Free Monad Free はパラメータに Functor のインスタンスを与えることでモナドになるデータ型です。 Functor の定義から見ていきましょう。 trait Functor[F[_]] { def map[A, B](fa: F[A])(f: A => B): F[B] } 計算コンテナ F に対して map という関数が定義されます。 map は F[A] の計算値 A に関数 A => B を適用し F[B] を得ます。
「モナドは象だ(Monads are Elephants)」日本語訳¶ この文章は、以下の記事の翻訳です。 Monads are Elephants: http://james-iry.blogspot.com/2007/09/monads-are-elephants-part-1.html http://james-iry.blogspot.com/2007/10/monads-are-elephants-part-2.html http://james-iry.blogspot.com/2007/10/monads-are-elephants-part-3.html http://james-iry.blogspot.com/2007/11/monads-are-elephants-part-4.html JAMES IRY:ONE DIV ZERO: http://james-iry
スタックレスScala Stackless Scala With Free Monadsを参考にTrampolineやそれを抽象化したFreeを紹介します。 Abstract Scalaコンパイラの末尾再帰除去は自分自身を呼び出すメソッドのみに限定されます。 今回はどのような再帰呼び出しでもスタックを消費しないようにする方法を紹介します。 Introduction Scalaでプログラムを書いてjava.lang.StackOverflowErrorに遭遇した経験があることでしょう。 def factorial(n: BigInt): BigInt = if (n <= 1) 1 else n * factorial(n - 1) scala> factorial(10000) java.lang.StackOverflowError at java.math.BigInteger.sub
組み合わせるとはつまりアレのことを書くのですが、一応それほど前提知識無くても理解できるように書いてみます。さて、なぜいきなりEitherとFutureか?というと play2とか使ってると、Futureがよく出てくる Futureをそこら中でAwaitしたらFuture使う意味がないので、Future[A]をmapやflatMapなどでどんどん連鎖させて、メソッドの型にFutureが大量に出現! Futureは非同期に行われる処理であり、そこで例外発生したら、その中に例外を含むしかない(単純に例外投げるわけにはいかないというか不可能) Scala標準ライブラリのFutureは、Throwable型で例外を保持できるようになってる 逆にいうと、Throwableでしか保持できない 例外の種類が多くなってきて、プログラムが複雑になった場合、Throwableではなくもっと限定された独自のエラー
sealed trait Freer[F[_], A] { def map[B](f: A => B): Freer[F, B] = flatMap(a => Pure(f(a))) def flatMap[B](f: A => Freer[F, B]): Freer[F, B] = this match { case Pure(a) => f(a) case Impure(fa, g) => Impure(fa, (a: Any) => g(a).flatMap(f)) } } case class Pure[F[_], A](a: A) extends Freer[F, A] case class Impure[F[_], A, B](fa: F[A], f: A => Freer[F, B]) extends Freer[F, B]
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く