Download free for 30 days
Sign in
Upload
Language (EN)
Support
Business
Mobile
Social Media
Marketing
Technology
Art & Photos
Career
Design
Education
Presentations & Public Speaking
Government & Nonprofit
Healthcare
Internet
Law
Leadership & Management
Automotive
Engineering
Software
Recruiting & HR
Retail
Sales
Services
Science
Small Business & Entrepreneurship
Food
Environment
Economy & Finance
Data & Analytics
Investor Relations
Sports
Spiritual
News & Politics
Travel
Self Improvement
Real Estate
Entertainment & Humor
Health & Medicine
Devices & Hardware
Lifestyle
Change Language
Language
English
Español
Português
Français
Deutsche
Cancel
Save
Submit search
EN
TO
Uploaded by
Taisuke Oe
PDF, PPTX
2,421 views
AuxパターンをDottyで解決する
#SyogunMatsuri #ScalaMatsuri
Software
◦
Read more
1
Save
Share
Embed
Embed presentation
Download
Download as PDF, PPTX
1
/ 18
2
/ 18
3
/ 18
4
/ 18
5
/ 18
6
/ 18
7
/ 18
8
/ 18
9
/ 18
10
/ 18
11
/ 18
12
/ 18
13
/ 18
14
/ 18
15
/ 18
16
/ 18
17
/ 18
18
/ 18
More Related Content
PDF
What Dotty fixes @ Scala関西サミット
by
Taisuke Oe
PDF
Scala の関数型プログラミングを支える技術
by
Naoki Aoyama
PDF
今から始める Lens/Prism
by
Naoki Aoyama
PDF
プログラミング言語Scala
by
TanUkkii
PDF
Scalaで型クラス入門
by
Makoto Fukuhara
PDF
Ekmett勉強会発表資料
by
時響 逢坂
PDF
Van laarhoven lens
by
Naoki Aoyama
PDF
たのしい関数型
by
Shinichi Kozake
What Dotty fixes @ Scala関西サミット
by
Taisuke Oe
Scala の関数型プログラミングを支える技術
by
Naoki Aoyama
今から始める Lens/Prism
by
Naoki Aoyama
プログラミング言語Scala
by
TanUkkii
Scalaで型クラス入門
by
Makoto Fukuhara
Ekmett勉強会発表資料
by
時響 逢坂
Van laarhoven lens
by
Naoki Aoyama
たのしい関数型
by
Shinichi Kozake
What's hot
PPT
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
by
nagise
PPT
ジェネリクスの基礎とクラス設計への応用
by
nagise
PDF
Material
by
_TUNE_
PDF
JavaのGenericsとは?
by
Kenji Nakamura
ODP
Ekmett勉強会発表資料
by
時響 逢坂
PDF
Phantom Type in Scala
by
Yasuyuki Maeda
KEY
Algebraic DP: 動的計画法を書きやすく
by
Hiromi Ishii
PPTX
Sns suite presentation
by
Jason Namkung
PPT
Pythonintro
by
Mikio Kubo
PDF
Thinking in Cats
by
Eugene Yokota
PPTX
大人のお型付け
by
Nobuhisa Koizumi
PDF
BOF1-Scala02.pdf
by
Hiroshi Ono
PDF
Implicit Explicit Scala
by
Kota Mizushima
PDF
Haskell超入門 Part.1
by
Yuichi Watanabe
PDF
磯野ー!関数型言語やろうぜー!
by
Ra Zon
PDF
Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
by
Tomohiro Kumagai
PPTX
関数型言語&形式的手法セミナー(3)
by
啓 小笠原
PPT
Rpscala2011 0601
by
Hajime Yanagawa
PDF
実務者のためのかんたんScalaz
by
Tomoharu ASAMI
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
by
nagise
ジェネリクスの基礎とクラス設計への応用
by
nagise
Material
by
_TUNE_
JavaのGenericsとは?
by
Kenji Nakamura
Ekmett勉強会発表資料
by
時響 逢坂
Phantom Type in Scala
by
Yasuyuki Maeda
Algebraic DP: 動的計画法を書きやすく
by
Hiromi Ishii
Sns suite presentation
by
Jason Namkung
Pythonintro
by
Mikio Kubo
Thinking in Cats
by
Eugene Yokota
大人のお型付け
by
Nobuhisa Koizumi
BOF1-Scala02.pdf
by
Hiroshi Ono
Implicit Explicit Scala
by
Kota Mizushima
Haskell超入門 Part.1
by
Yuichi Watanabe
磯野ー!関数型言語やろうぜー!
by
Ra Zon
Swift 3 で新しくなったところ - 表面から見えにくいところを中心に紹介 #ISAOcorp
by
Tomohiro Kumagai
関数型言語&形式的手法セミナー(3)
by
啓 小笠原
Rpscala2011 0601
by
Hajime Yanagawa
実務者のためのかんたんScalaz
by
Tomoharu ASAMI
Similar to AuxパターンをDottyで解決する
PDF
こわくない型クラス
by
Kota Mizushima
PDF
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
by
Tomoharu ASAMI
PDF
第5章 拡張モデル(前半)
by
Akito Nakano
PDF
Tpp2012 mwpl on_coq
by
SUDA Keishi
PDF
すごいH 第12章モノイド
by
Shinta Hatatani
PDF
型クラス
by
hakukotsu
PDF
Scalaプログラミング・マニアックス
by
Tomoharu ASAMI
PPTX
20170706 04 bridgepointでモデル駆動を実践する
by
Yuki Tsuchitoi
PDF
BOF1-Scala02.pdf
by
Hiroshi Ono
PDF
BOF1-Scala02.pdf
by
Hiroshi Ono
KEY
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
by
Hiromi Ishii
こわくない型クラス
by
Kota Mizushima
関数モデル 【クラウドアプリケーションのためのオブジェクト指向分析設計講座 第8回】
by
Tomoharu ASAMI
第5章 拡張モデル(前半)
by
Akito Nakano
Tpp2012 mwpl on_coq
by
SUDA Keishi
すごいH 第12章モノイド
by
Shinta Hatatani
型クラス
by
hakukotsu
Scalaプログラミング・マニアックス
by
Tomoharu ASAMI
20170706 04 bridgepointでモデル駆動を実践する
by
Yuki Tsuchitoi
BOF1-Scala02.pdf
by
Hiroshi Ono
BOF1-Scala02.pdf
by
Hiroshi Ono
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
by
Hiromi Ishii
More from Taisuke Oe
PDF
プレScalaMatsuri2019「スピーカー入門」
by
Taisuke Oe
PDF
How to start functional programming (in Scala): Day1
by
Taisuke Oe
PDF
Monix Taskが便利だという話
by
Taisuke Oe
PDF
How to get along with implicits
by
Taisuke Oe
PDF
Real World Android Akka - 日本語版
by
Taisuke Oe
PDF
Real World Android Akka
by
Taisuke Oe
PDF
Real world android akka
by
Taisuke Oe
PDF
多相な関数の定義から学ぶ、型クラスデザインパターン
by
Taisuke Oe
PDF
Android BLEのつらみを予防するTips
by
Taisuke Oe
PDF
BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~
by
Taisuke Oe
プレScalaMatsuri2019「スピーカー入門」
by
Taisuke Oe
How to start functional programming (in Scala): Day1
by
Taisuke Oe
Monix Taskが便利だという話
by
Taisuke Oe
How to get along with implicits
by
Taisuke Oe
Real World Android Akka - 日本語版
by
Taisuke Oe
Real World Android Akka
by
Taisuke Oe
Real world android akka
by
Taisuke Oe
多相な関数の定義から学ぶ、型クラスデザインパターン
by
Taisuke Oe
Android BLEのつらみを予防するTips
by
Taisuke Oe
BONXを支える技術:Bluetooth編 ~Bluetoothを120%使い倒す方法~
by
Taisuke Oe
AuxパターンをDottyで解決する
1.
AUXパターンをDOTTYで解決する
2.
自己紹介 麻植泰輔 ScalaMatsuri 座長 Septeni Original,
Inc. 技術アドバイザー 7/6 新宿 Geek Lounge で 「Real World Android Akka」を 日本語で 喋ります! BONX, INC. 所属 将軍家の皆さま、ご協賛ありがとうございました! 来年春頃(予定) ScalaMatsuri 2018 もぜひよろしくお願いします m(_ _)m もしScalaMatsuri経由で入社した方が居た場合、ぜひ記事化させてください @OE_uia
3.
今日のトピック Dottyの何が嬉しいの? の一部を紹介する 型クラスの型パラメーター同士に依存関係がある場合 Scala 2.x
=> Auxパターン Dotty a.k.a. Scala 3.x => ???
4.
型クラス 既存の型に対し、共通の振る舞いを後から定義する (アドホック多相を実現する) ためのデザインパターン trait Semigroup[A]{ def
append(a1:A,a2:A):A } object Semigroup{ implicit val intGroup:Semigroup[Int] = new Semigroup[Int]{ def append(a1:Int,a2:Int):Int = a1 + a2 } } object SemigroupSyntax{ def append[A](a1:A, a2:A)(implicit S:Semigroup[A]):A = S.append(a1,a2) } import SemigroupSyntax._ append(1,2) // 3
5.
DEPENDENT METHOD TYPE 引数の型に依存して、メソッドのシグネチャ(のうち、多くの場合は戻り値の型)を変化させることができる 型クラスと組み合わせるパターンを、Magnet
Patternと呼ぶ 引数の型にマグネットがくっついて、戻り値の型が変化するイメージ?
6.
型クラス + DEPENDENT
METHOD TYPEの例 Measurableという型クラスを使って、Dependent Method Typeを活用する例 trait Measurable[A]{ type Size def sizeOf(a:A):Size } object Measurable{ implicit val intSize:Measurable[Int] = new Measurable[Int]{ type Size = Int def sizeOf(i:Int):Int = i } implicit def seqSize[A]:Measurable[Seq[A]] = new Measurable[Seq[A]]{ type Size = Int def sizeOf(s:Seq[A]):Int = s.size } } object MeasurableSyntax{ def measure[A](a:A)(implicit M:Measurable[A]):M.Size = M.sizeOf(a) } import MeasurableSyntax._ measure(Seq(1,2,3)) // 3 measure(1) // 1
7.
型クラスを組み合わせたい… 一つの引数リストに両方入れる? さっきのSemigroupとMeasurableを組み合わせると、こんな感じ…? def sumSizes[A](a1:A,a2:A)(implicit M:Measurable[A],
S:Semigroup[M.Size]):M.Size S.append(M.sizeOf(a1),M.sizeOf(a2))
8.
コンパイルが通らない! 同じ引数リスト内の引数を参照できない scala> def sumSizes[A](a1:A,a2:A)(implicit
M:Measurable[A], S:Semigroup[M.Size]): | S.append(M.measure(a1),M.measure(a2)) <console>:32: error: illegal dependent method type: parameter may only be referenced in a subsequent parameter section def sumSizes[A](a1:A,a2:A)(implicit M:Measurable[A], S:Semigroup[M.Size]): ^
9.
型クラスを組み合わせたい…(TAKE 2) 複数の暗黙の引数リストを使う? じゃあ subsequent
parameter section ということは、こんな感じ? def sumSizes[A](a1:A,a2:A)(implicit M:Measurable[A])(implicit S:Semigroup[M.Size S.append(M.sizeOf(a1),M.sizeOf(a2))
10.
コンパイルが通らない! 暗黙の引数リストは1つまで <console>:1: error: an
implicit parameter section must be last def sumSizes[A](a1:A,a2:A)(implicit M:Measurable[A])(implicit S:Semigroup[M.Size ^ <console>:1: error: multiple implicit parameter sections are not allowed def sumSizes[A](a1:A,a2:A)(implicit M:Measurable[A])(implicit S:Semigroup[M.Size ^
11.
型クラスを組み合わせたい…(TAKE 3) AUXパターン!! 型メンバを型パラメーターへマッピングすることで、暗黙のパラメーターが持つ型パラメーター同士で依存させることができる trait Measurable[A]{ type
Size def sizeOf(a:A):Size } //ここまで同じ object Measurable{ type Aux[A0,B0] = Measurable[A0]{type Size = B0} implicit val intAux:Measurable.Aux[Int,Int] = new Measurable[Int]{ type Size = Int def sizeOf(i:Int):Int = i } } def sumSizes[A,Size](a1:A,a2:A)(implicit M:Measurable.Aux[A,Size], S:Semigroup[Size S.append(M.sizeOf(a1),M.sizeOf(a2))
12.
コンパイル通る! …けど、ちょっとhacky。
13.
DOTTY A.K.A. SCALA
3.0 EPFLの小田好先生の研究室で開発を主導 現在pre-alpha 日々アクティブに開発されてるので、 以下、 scalaVersion := "0.1.1-bin-20170511-cc4533d-NIGHTLY" で実験 Nightly Buildsを試せる!
14.
IMPLICIT FUNCTION TYPE 暗黙の引数を取る関数、を型で表現 trait
Semigroup[A]{ def append(a1:A,a2:A):A } object Semigroup{ implicit val intGroup:Semigroup[Int] = new Semigroup[Int]{ def append(a1:Int,a2:Int):Int = a1 + a2 } } //ここまで先程の例と一緒 object SemigroupSyntax{ type Semigroupish[A] = implicit Semigroup[A] => A def append[A](a1:A, a2:A):Semigroupish[A] = {implicit S => S.append(a1,a2)} } object SemigroupMeasurableSyntax { import SemigroupSyntax._ def sumSizes[A](a1:A,a2:A)(implicit M:Measurable[A]):Semigroupish[M.Size] = append( }
15.
MULTIPLE IMPLICIT PARAMETER
LISTS Implicit Function Typeのメソッド表現 いずれかの暗黙の引数 のみ に明示的に値を渡す場合、どの暗黙の引数リストに渡すか決定する構文が欲しい f.explicitly(...) ... ? まだ提案段階だが、入る可能性高そう? //今(5/11 nightly builds)はまだ出来ないが、そのうちこうやって書けるようになるはず def sumSizes[A](a1:A,a2:A)(implicit M:Measurable[A])(implicit S:Semigroup[M.Size S.append(M.sizeOf(a1),M.sizeOf(a2))
16.
でも実は... 一つの引数リストに両方入れる Scala 2.x系ではコンパイルは通らなかったが… object SemigroupMeasurableSyntax
{ def sumSizes[A](a1:A,a2:A)(implicit M:Measurable[A], S:Semigroup[M.Size]):M.Size S.append(M.sizeOf(a1),M.sizeOf(a2)) }
17.
/(^O^) defined trait Measurable defined
module Measurable defined module MeasurableSyntax defined trait Semigroup defined module Semigroup defined module SemigroupSyntax defined module SemigroupMeasurableSyntax <- !?!?!? Dottyではコンパイル通る!!!
18.
結論 DottyになればAuxパターンは不要になる(ハズ) :tada: 型クラスの型パラメーター同士に依存関係がある場合 Scala 2.x
=> Auxパターン Dotty a.k.a. Scala 3.x => 共通の暗黙の引数リスト || Implicit Function Type 注: Implicit Function Typeは、Auxパターンをなくすこと「だけ」が目的では有りません 文脈から値を取り出すことを抽象化する、大変強力な構文です をご参照のこと。小田好先生のブログ
Download