Scala陰陽術! こわくない型の話 怖くないScala勉強会 2013/10/19 @gakuzzzz Tech to Value Co., Ltd.
Scalaのforは構文糖衣なんだけど、書き方に応じてmapやflatMapやforEachに変換されてよくわからないので、ルールをまとめた。 参考資料: Scala Language Specification Version 2.9(pdf)。ちょっと古いけどこのへんのルールは今も変わってないと思われる。 ステップ1 出現する全てのnot irrefutableなパターン部(※)を持つジェネレータp <- eを以下の形に変形する p <- e.withFilter { case p => true; case _ => false } ※not irrefutable: 必ずマッチするとは限らないようなパターンの意。 ステップ2 すべてのfor内包表記が消滅するまで、以下のルールを繰り返し適用する ジェネレータの変換に関するルール パターン: p <- e; if g p <- e.w
Play Framework では json を扱うためのライブラリ play-json が提供されています。 扱いやすいライブラリだと思うのですがいつも細かい API を忘れてしまうので整理しておきたいと思いました。 ここで使用しているコードは こちら のリポジトリに保管しています。 Json を表現する型 文字列との単純な相互変換 Json に対する操作 Reads, Writes, Format 型 複雑な Reads, Writes の作成 1. Json を表現する型 play-json では json を JsValue 型で表現しており、そのデータ型は Haskell 風に書けば以下のようになります。 data JsValue = JsObject (Map String JsValue) | JsArray [JsValue] | JsNumber BigDecimal |
"Scala Future" で検索して出てくるFutureの解説は、Scala公式サイトのドキュメントを除いて大体こんな感じで紹介されてることが多い。 import scala.concurrent._ import ExecutionContext.Implicits.global Future { Thread.sleep(1000) println("hoge") } println("fuga") //-> // fuga // hoge こういうFuture.applyにThread.sleepやIOのblockingをする例って非常に悪いと思っている。まるで、Futureでsleepするのが普通のコードっぽく見えるじゃん。違うの、単に説明の時に楽だからsleepしてるだけなの。説明コードが短くてすむの。ちょっと使ってるだけ。プロダクトコードでsleepするのやめろ。うわあ!!
import scala._ // Wild card -- all of Scala is imported import scala.{ Predef => _, _ } // Exception, everything except Predef def f[M[_]] // Higher kinded type parameter def f(m: M[_]) // Existential type _ + _ // Anonymous function placeholder parameter m _ // Eta expansion of method into method value m(_) // Partial function application _ => 5 // Discarded parameter case _ => // Wild card patte
(今回のコードは github:everpeace/composing-monads にあります。) 一般に、モナドって合成できないって言われますよね。 でも、モナドって合成できる場合も有るんです。 今回はまず、合成が難しい(できない)理由を説明して、 じゃぁ「モナドが合成できる時」はいつなのか? というのと「合成できるモナドたち」をちょっとだけ紹介してみます。 それにはまず、ここから始めましょう。 モナドをflatMapじゃなくてflattenで定義してみる。 flatMapで定義されるモナドのおさらい Mというモナドは次の用に定義されます。 trait Functor[F[_]]{ def map[A,B](fa:F[A])(f:(A) => B):F[B] } trait Monad[M[_]] extends Functor[M]{ def unit[A](a:A):M[A] de
index.md MonadTransformer とは何か 注意書き この記事は Monad がわかる人に向けた MonadTransformer の解説記事です。 すごいH本や FP in Scala などでモナドまではイメージが掴めたけれど、モナドトランスフォーマーが何かわからない、という層をターゲットに想定しています。 基本的に Functor, Applicative, Monad および型クラスについては把握しているものとしますので、この辺があやふやな方は別の資料などをご参照下さい。 サンプルコードとして Scala を利用します。ただし、説明の都合上、高階型引数について kind-projector の ? を用いた表記を使います。 例えば List[A] 型のモナドインスタンスは通常 Monad[List] 型として表しますが、この資料では Monad[List[?]] と
はじめに Playframework2.0の正式版がリリースされてからしばらくたちました。 すでにドキュメントもあり、翻訳作業もすすんでいます。 ドキュメントはPlayframeworkの各種機能やAPIについて解説しており、非常に役に立つのですが、1.2のときにあったような、 チュートリアル形式でアプリケーションを作成するガイド(yabeと呼ばれるblogエンジンをつくるチュートリアル)はいまのところ存在しません。 というわけで、この記事ではyabeライクなblogエンジンぽいものをPlayframework2.0(Scala)を使用して作成していきます。 今回使用した動作環境は以下のとおりです。 OS : MacOS X 10.7.3 Java : 1.6.0_26 Scala : 2.9.1 final Playframework : 2.0 ここからplayframework2.0
今回は 抽出子 だよ。 こいつを使えるようになると、更にパターンマッチが便利になるんだ。 こんな感じで進めてみるよ! 抽出子とは 抽出子を使う unapplySeqメソッド applyメソッド applyとunapplyの関係 まとめ 抽出子とは unapplyメソッドが定義されているオブジェクト のことです。 定義としては簡単だね! このメソッドの役割は、受け取ったインスタンスを分解して、 何かを抽出する ことです。 パターンマッチでこのメソッドが使われることが多いです。 抽出子を使う 早速使ってみよう! パターンマッチで使う import scala.Option class User(private val firstname: String, private val lastname: String) object User { def unapply(user: User) =
これなんなの? 「Scalaの記号はググラビリティ低すぎて調べようがないし全くわからん…せめて定義位置とか実装がわかれば…」という自分のためのメモ、いわゆるチラシの裏です。 とりあえずScalaの記号については、ソースコードをダウンロードして下記の正規表現でgrepしました。 基本、わからない記号見つけたら定義元に飛んで 1、ソースを読んでます。 2 IDEで定義元に飛べない記号(_*など)は、言語仕様の可能性が高いので言語仕様を読みましょう。 記号の使用例がわからない場合、そのライブラリのテストコードを読むと良いケースがあります。 急に()が出てきた場合、カリー化された引数かapply()です。 apply()の場合、一時的に書き換えてショートカットキーで飛ぶか、検索してapply()の定義を確認します。 記号がぐぐれない問題に関しては、 https://t.co/qEY3k2cRIM
class: center, middle # Implicit 入門 Scala Matsuri 2018 03/16 --- class: left, middle ## 自己紹介 * 中村 学(Nakamura Manabu) * [@gakuzzzz](https://twitter.com/gakuzzzz) * Tech to Value 代表取締役 * Opt Technologies 技術顧問 <img src="../images/opt_logo_1.jpg" alt="Opt Technologies" width="450" style="margin-left: 0px" /> * f-code CTO <img src="../images/f-code_logo.png" alt="f-code" height="120" style="margin-left
ScalaMatsuriは参加者、スポンサー、スタッフ等、皆様のおかげで盛況のうちに終了しました。 ご来場・ご協力いただいた皆様、ありがとうございました。
リリース、障害情報などのサービスのお知らせ
最新の人気エントリーの配信
処理を実行中です
j次のブックマーク
k前のブックマーク
lあとで読む
eコメント一覧を開く
oページを開く