SlideShare une entreprise Scribd logo
1  sur  32
Télécharger pour lire hors ligne
Phantom Type in Scala	
 
ファントムタイプ社の社長にみんなでPhatom Typeを教える会



        2012.10.06 前田康行(@maeda_)
自己紹介	
 

•  前⽥田康⾏行行 (@maeda_ )


•  好きな⾔言語
  •  Scala
  •  Smalltalk


•  DyNagoya (Dynamic language + Nagoya)
  •  http://dynagoya.info
About Phatom Type	
 

A phantom type is a parametrised type whose
parameters do not all appear on the right-hand
side of its definition



- Haskell wiki より抜粋 -

http://www.haskell.org/haskellwiki/Phantom_type
幽霊型の例	
 
•  型パラメータTはcase classのフィールドに使われて
   いない
case class A[T](x : Int)

scala> A[String](3)
res0: A [String] = A(3)

scala> A [List[Char]](3)
res1: A [List[Char]] = A(3)

scala> res0 == res1
res2: Boolean = true

•  特にScalaの場合、Type Erasureにより実⾏行行時に型パ
   ラメータは消える
Phantom Typeは幽霊なのか?	
 

•  Phantom Type(幽霊型)は
 •  実⾏行行時ではなく、コンパイル時にのみ暗躍する。
 •  条件を満たさないと、コンパイルエラーにして実⾏行行
    できなくする呪いをかける
 •  コンパイルが通ると成仏していなくなる


•  これは幽霊ですね
Phatom Typeの実用例	
 1
            Type Safeな構文木	
 
    •  Expr[T]は評価結果がT型となることを表す
trait Expr[T]
case object True extends Expr[Boolean]
case object False extends Expr [Boolean]
case class Number(x: Int) extendsExpr [Int]
case class Plus(x1: Expr [Int], x2:Expr [Int]) extends Expr [Int]

scala> Plus(Plus(Number(3),Number(4)),Number(5))
res4: Plus = Plus(Plus(Number(3),Number(4)),Number(5))

scala> Plus(Plus(Number(3), Number(4)), True) // PlusにBooleanは渡せない
<console>:14: error: type mismatch;
 found : True.type
 required: Expr[Int]
          Plus(Plus(Number(3), Number(4)), True)
Phatom Typeの実用例	
 2
             状態を表す(定義)	
 
sealed trait State
class Empty private () extends State
class Ready private () extends State

class Dinner[Oeuvre <: State, MainDish <: State, Dessert <: State] (){
   def cookSalad = new Dinner[Ready, MainDish, Dessert]
   def cookSoup = new Dinner[Ready, MainDish, Dessert]
   def cookSteak = new Dinner[Oeuvre, Ready, Dessert]
   def cookCake = new Dinner[Oeuvre, MainDish, Ready]

  def serve() = println("Now you can eat!")
}
object Dinner{
  def start = new Dinner[Empty, Empty, Empty]
}
Phatom Typeの実用例	
 2
          状態を表す(実行例)	
 
scala> Dinner.start
res0: Dinner[Empty, Empty, Empty] = Dinner@4b401150


scala> Dinner.start.cookSalad.cookCake
res1: Dinner[Ready, Empty, Ready] = Dinner@6d9e4f58


scala> Dinner.start.cookSalad.cookCake.serve()
Now you can eat!


scala> Dinner.start.cookSalad.cookSteak.cookSoup.serve()
Now you can eat!
ただのタグじゃなくて、
コンパイルエラーにしたい
そこで
 Implicit Parameter
(暗黙のパラメータ)
      ですよ
implicit parameterの例	
 
// implicit parameter付きの関数の宣⾔言
scala> def func(implicit ev: Int) = m
// implicit parameterが⾒見見つからないのでエラー
scala> func
<console>:9: error: could not find implicit value for parameter
m: Int

// スコープ内にimplicitで宣⾔言した値があると、⾃自動的に渡される
scala> implicit val v = 3
scala> func // → 3

 •  スコープ内のimplicitで宣⾔言された値の中で、
    型が合う値をコンパイル時に探索する
多相的なimplicit parameter	
 
scala> def implicitly[T](implicit ev: T) = m

scala> implicit val v = 3
scala> implicitly[Int]         // → 3
scala> implicitly[String]      // →  コンパイルエラー


 •  implicitlyメソッドはPredefに標準で定義されている

 •  型パラメータで指定された型のimplicitに取得できる
    値を探索
もう少しお行儀よく	
 
class Tag[A]()
def func[A](implicit ev: Tag[A]) = "OK
implicit val intAllowed = new Tag[Int]


scala> func[Int]       // → OK
scala> func[String]     // →コンパイルエラー

 •  普通に使う型をimplicitで宣⾔言するのはよくない

 •  implicitで使⽤用するための型を⽤用意して、その型
    パラメータで特定の型を指定する⽅方がいい
型パラメータを2つにする	
 
class Tag[A, B] ()
def func[A, B](implicit ev: Tag[A, B]) = "OK"
implicit val intAllowed = new Tag[Int, Int]
implicit val stringAllowed = new Tag[String, String]

scala> func[Int, Int]    // OK
scala> func[Int, String] // コンパイルエラー

 •  個別に使⽤用可能な型の組み合わせをimplicitで宣
    ⾔言する
任意の2つの型が同じである
   ことを表現したい	
 
•  型パラメータを持った値は扱えない

   implicit val x[A] = new Tag[A, A]


•  メソッドなら型パラメータを持てる
 ○ implicit def f[A] = new Tag[A, A]
2つの型が同じ場合
         呼び出し可能な関数	
 
class Tag[A, B] ()
implicit def equalAllowed[A] = new Tag[A, A]
def func[A, B](implicit ev: Tag[A, B]) = "OK


scala> func[Int, Int]    // → OK
scala> func[Int, String] // → コンパイルエラー
インスタンス生成の無駄を省く	
 
class Tag[A, B] ()
val singletonTag = new Tag[Any, Any]
implicit def equalAllowed[A]: Tag[A, A] =
           singletonTag.asInstanceOf[Tag[A, A]]

def func[A, B](implicit ev: Tag[A, B]) = "OK"

 •  implicitで呼び出される度にインスタンス⽣生成するのは無駄

 •  implicitで渡される値は使われないので、型さえあえば、中
    ⾝身はなんでもいい

 •  nullでもOK
2つの型パラメータをとる型の
   シンタックスシュガー	
 
scala> class Op[A, B] ()

scala> val x: Op[Int, String] = new Op
x: Op[Int,String] = Op@ab612f8

scala> val x: Int Op String = new Op
x: Op[Int,String] = Op@165e6c89

•  中置記法の⽅方が型の演算⼦子っぽく⾒見見える
•  クラス名に記号も使える。記号の⽅方がより演算⼦子っぽい
Scala 2.10-M7の実装	
 
sealed abstract class =:=[From, To]
                  extends (From => To) with Serializable
private[this] final val singleton_=:= =
        new =:=[Any,Any] { def apply(x: Any): Any = x }
object =:= {
    implicit def tpEquals[A]: A =:= A =
      singleton_=:=.asInstanceOf[A =:= A]
}

•  From => To を継承しているため、型を変換する関数とし
   て使える
def func[A](x1: A)(implicit w: A =:= B ) = {
  val x2 = w(x1)             // x2はB型として使える
  ...
}

•  Serializableを継承している利⽤用は不明
generalized type constraints	
 
scala> implicitly[Int =:= Int]
res7: =:=[Int,Int] = <function1>


scala> implicitly[Int =:= String]
<console>:9: error: Cannot prove that Int =:= String.
         implicitly[Int =:= String]
                 ^


    •  異なる型を渡すとコンパイルエラー
Prove?	
 

これは、あの証明ですか?	
 



      ← あの証明です
証明は身近な存在	
 

•  カリー・ハワード同型対応
 •  型 ⇆ 命題
 •  プログラム ⇆ 証明


•  プログラムに型が付く ⇆ 命題が証明された



•  「A =:= B」型について、それを満たすimplicitをコ
   ンパイラが⾒見見つけて、型が付けば、「AがBであるこ
   と」が証明されている
定理証明支援器 Coq	
 

•  型の表現⼒力力がすごい
   例:迷路の経路が最短経路である型
   http://d.hatena.ne.jp/yoshihiro503/20100119



•  そんな型を満たすようなプログラムを書くのは⼤大
   変
  •  Coqは⼈人にやさしい形で⽀支援してくれる
一方、Scalaは	
 

•  型レベルλ計算
   http://apocalisp.wordpress.com/
   2010/06/08/type-level-programming-in-
   scala/
•  型レベル命題論理
   http://www.chuusai.com/2011/06/09/scala-
   union-types-curry-howard/


•  ⼀一応、がんばれば、、、
まとめ	
 

•  Phantom Type(幽霊型)はコンパイル時に暗躍

•  使いこなすには型レベルでいろいろやりたくなる

•  Scalaでは、implicit parameterを利⽤用して、コ
   ンパイル時にいろいろできる

•  Coqすごい
もっと型の力を知りたい人は	
 
•  ProofCafe(毎⽉月第4⼟土曜)
  •  名古屋でプログラムの証明について勉強する勉強会で
     す。現在はソフトウェアの基礎というドキュメントを
     読んでいます。コーヒーを飲みながら楽しく証明しま
     しょう。
     http://proofcafe.org/wiki/

•  TAPL-nagoya (毎⽉月第3⼟土曜)
  •  ScalaやF#やSML#などの静的型付け⾔言語の基礎に
     なっている型理論についての勉強会です。英語ですが、
     説明が丁寧で例が豊富な TAPL をみんなで読みます。
  •  http://proofcafe.org/tapl/
その他
<%< はなくなった
            (2.10から)	
 
 •  「A => B」でOK

scala> implicitly[ Int <%< Long ]
<console>:12: error: not found: type >%>
         implicitly[ Int <%< Long ]
                      ^


scala> implicitly[ Int => Long ]
res5: Int => Long = <function1>
<%<は、なぜなくなったのか	
 


•  SI-2781

•  type inference constraints should be
   carried along during search for chained
   implicits

•  https://issues.scala-lang.org/browse/
   SI-2781
演習問題	
 1	
 
•  9ページの例をコンパイルエラーを出すようにする

scala> Dinner.start.cookSalad.cookCake.serve()
<console>:8: error: Cannot prove that Dinner.Empty =:=
Dinner.Ready.
         Dinner.start.cookSalad.cookCake.serve()
                                  ^
scala> Dinner.start.cookSalad.cookCake.cookSalad
<console>:8: error: Cannot prove that Dinner.Ready =:=
Dinner.Empty.
         Dinner.start.cookSalad.cookCake.cookSalad
                               ^

scala> Dinner.start.cookSalad.cookCake.cookSteak.serve()
Now you can eat!
演習問題 2	
 
•  AがBの⼦子クラスであるかをチェックする型を考えてみる

scala> trait A
scala> trait B with A

scala> implicitly[ B <:< A ]
res9: <:<[B,A] = <function1>

scala> implicitly[ A <:< B ]
<console>:14: error: Cannot prove that A <:< B.
         implicitly[ A <:< B ]
参考文献	
 
•  Type classes as objects and implicitsBruno
   C.d.S. Oliveira, Adriaan Moors,
   Martin Odersky
   OOPSLA ʻ‘10 Proceedings of the ACM
   international conference on Object oriented
   programming systems languages and
   applications, 2010

  この論⽂文の「6.6 Encoding generalized
  constraints」に>:>の話がある(少しだけど)

Contenu connexe

Tendances

プロダクトに貢献する~テスト計画コンシェルジュとリリース高速化で品質向上を牽引する~
プロダクトに貢献する~テスト計画コンシェルジュとリリース高速化で品質向上を牽引する~プロダクトに貢献する~テスト計画コンシェルジュとリリース高速化で品質向上を牽引する~
プロダクトに貢献する~テスト計画コンシェルジュとリリース高速化で品質向上を牽引する~Naoki Nakano
 
Amazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデート
Amazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデートAmazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデート
Amazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデートAmazon Web Services Japan
 
[20220126] JAWS-UG 2022初頭までに葬ったAWSアンチパターン大紹介
[20220126] JAWS-UG 2022初頭までに葬ったAWSアンチパターン大紹介[20220126] JAWS-UG 2022初頭までに葬ったAWSアンチパターン大紹介
[20220126] JAWS-UG 2022初頭までに葬ったAWSアンチパターン大紹介Amazon Web Services Japan
 
フリーでできるWebセキュリティ(burp編)
フリーでできるWebセキュリティ(burp編)フリーでできるWebセキュリティ(burp編)
フリーでできるWebセキュリティ(burp編)abend_cve_9999_0001
 
エムスリーのQAチームが目指すもの
エムスリーのQAチームが目指すものエムスリーのQAチームが目指すもの
エムスリーのQAチームが目指すものYuki Shiromoto
 
20210317 AWS Black Belt Online Seminar Amazon MQ
20210317 AWS Black Belt Online Seminar Amazon MQ 20210317 AWS Black Belt Online Seminar Amazon MQ
20210317 AWS Black Belt Online Seminar Amazon MQ Amazon Web Services Japan
 
[よくわかるクラウドデータベース] リクルートにおけるRedshift導入・活用事例
[よくわかるクラウドデータベース] リクルートにおけるRedshift導入・活用事例[よくわかるクラウドデータベース] リクルートにおけるRedshift導入・活用事例
[よくわかるクラウドデータベース] リクルートにおけるRedshift導入・活用事例Amazon Web Services Japan
 
人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with KarateTakanori Suzuki
 
テスト計画の立て方 WACATE2019 夏
テスト計画の立て方 WACATE2019 夏テスト計画の立て方 WACATE2019 夏
テスト計画の立て方 WACATE2019 夏Naoki Nakano
 
クラウドコストを最適化せよ!マルチクラウド時代に届けるクラウド活用2.0
クラウドコストを最適化せよ!マルチクラウド時代に届けるクラウド活用2.0クラウドコストを最適化せよ!マルチクラウド時代に届けるクラウド活用2.0
クラウドコストを最適化せよ!マルチクラウド時代に届けるクラウド活用2.0Tomohisa Koyanagi
 
Spring Boot + Netflix Eureka
Spring Boot + Netflix EurekaSpring Boot + Netflix Eureka
Spring Boot + Netflix Eureka心 谷本
 
AWS Black Belt Online Seminar 2017 Auto Scaling
AWS Black Belt Online Seminar 2017 Auto ScalingAWS Black Belt Online Seminar 2017 Auto Scaling
AWS Black Belt Online Seminar 2017 Auto ScalingAmazon Web Services Japan
 
AWS Black Belt Online Seminar 2017 Amazon ElastiCache
AWS Black Belt Online Seminar 2017 Amazon ElastiCacheAWS Black Belt Online Seminar 2017 Amazon ElastiCache
AWS Black Belt Online Seminar 2017 Amazon ElastiCacheAmazon Web Services Japan
 
画像ベース異常検知Amazon Lookout for Visionを使ってみよう
画像ベース異常検知Amazon Lookout for Visionを使ってみよう画像ベース異常検知Amazon Lookout for Visionを使ってみよう
画像ベース異常検知Amazon Lookout for Visionを使ってみようTakanoriTsutsui
 
AWS Black Belt Tech Webinar 2016 〜 Amazon CloudSearch & Amazon Elasticsearch ...
AWS Black Belt Tech Webinar 2016 〜 Amazon CloudSearch & Amazon Elasticsearch ...AWS Black Belt Tech Webinar 2016 〜 Amazon CloudSearch & Amazon Elasticsearch ...
AWS Black Belt Tech Webinar 2016 〜 Amazon CloudSearch & Amazon Elasticsearch ...Amazon Web Services Japan
 
会社概要_株式会社サーバーワークス
会社概要_株式会社サーバーワークス会社概要_株式会社サーバーワークス
会社概要_株式会社サーバーワークスServerworks Co.,Ltd.
 
Data platformdesign
Data platformdesignData platformdesign
Data platformdesignRyoma Nagata
 
CodePipeline入門
CodePipeline入門CodePipeline入門
CodePipeline入門ryota koyama
 

Tendances (20)

プロダクトに貢献する~テスト計画コンシェルジュとリリース高速化で品質向上を牽引する~
プロダクトに貢献する~テスト計画コンシェルジュとリリース高速化で品質向上を牽引する~プロダクトに貢献する~テスト計画コンシェルジュとリリース高速化で品質向上を牽引する~
プロダクトに貢献する~テスト計画コンシェルジュとリリース高速化で品質向上を牽引する~
 
Amazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデート
Amazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデートAmazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデート
Amazon Game Tech Night #25 ゲーム業界向け機械学習最新状況アップデート
 
[20220126] JAWS-UG 2022初頭までに葬ったAWSアンチパターン大紹介
[20220126] JAWS-UG 2022初頭までに葬ったAWSアンチパターン大紹介[20220126] JAWS-UG 2022初頭までに葬ったAWSアンチパターン大紹介
[20220126] JAWS-UG 2022初頭までに葬ったAWSアンチパターン大紹介
 
フリーでできるWebセキュリティ(burp編)
フリーでできるWebセキュリティ(burp編)フリーでできるWebセキュリティ(burp編)
フリーでできるWebセキュリティ(burp編)
 
エムスリーのQAチームが目指すもの
エムスリーのQAチームが目指すものエムスリーのQAチームが目指すもの
エムスリーのQAチームが目指すもの
 
20210317 AWS Black Belt Online Seminar Amazon MQ
20210317 AWS Black Belt Online Seminar Amazon MQ 20210317 AWS Black Belt Online Seminar Amazon MQ
20210317 AWS Black Belt Online Seminar Amazon MQ
 
[よくわかるクラウドデータベース] リクルートにおけるRedshift導入・活用事例
[よくわかるクラウドデータベース] リクルートにおけるRedshift導入・活用事例[よくわかるクラウドデータベース] リクルートにおけるRedshift導入・活用事例
[よくわかるクラウドデータベース] リクルートにおけるRedshift導入・活用事例
 
人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate人生がときめくAPIテスト自動化 with Karate
人生がときめくAPIテスト自動化 with Karate
 
テスト計画の立て方 WACATE2019 夏
テスト計画の立て方 WACATE2019 夏テスト計画の立て方 WACATE2019 夏
テスト計画の立て方 WACATE2019 夏
 
クラウドコストを最適化せよ!マルチクラウド時代に届けるクラウド活用2.0
クラウドコストを最適化せよ!マルチクラウド時代に届けるクラウド活用2.0クラウドコストを最適化せよ!マルチクラウド時代に届けるクラウド活用2.0
クラウドコストを最適化せよ!マルチクラウド時代に届けるクラウド活用2.0
 
Spring Boot + Netflix Eureka
Spring Boot + Netflix EurekaSpring Boot + Netflix Eureka
Spring Boot + Netflix Eureka
 
AWS Black Belt Techシリーズ AWS Lambda
AWS Black Belt Techシリーズ AWS LambdaAWS Black Belt Techシリーズ AWS Lambda
AWS Black Belt Techシリーズ AWS Lambda
 
AWS Black Belt Online Seminar 2017 Auto Scaling
AWS Black Belt Online Seminar 2017 Auto ScalingAWS Black Belt Online Seminar 2017 Auto Scaling
AWS Black Belt Online Seminar 2017 Auto Scaling
 
AWS Black Belt Online Seminar 2017 Amazon ElastiCache
AWS Black Belt Online Seminar 2017 Amazon ElastiCacheAWS Black Belt Online Seminar 2017 Amazon ElastiCache
AWS Black Belt Online Seminar 2017 Amazon ElastiCache
 
画像ベース異常検知Amazon Lookout for Visionを使ってみよう
画像ベース異常検知Amazon Lookout for Visionを使ってみよう画像ベース異常検知Amazon Lookout for Visionを使ってみよう
画像ベース異常検知Amazon Lookout for Visionを使ってみよう
 
AWS Black Belt Tech Webinar 2016 〜 Amazon CloudSearch & Amazon Elasticsearch ...
AWS Black Belt Tech Webinar 2016 〜 Amazon CloudSearch & Amazon Elasticsearch ...AWS Black Belt Tech Webinar 2016 〜 Amazon CloudSearch & Amazon Elasticsearch ...
AWS Black Belt Tech Webinar 2016 〜 Amazon CloudSearch & Amazon Elasticsearch ...
 
[BurpSuiteJapan]Burp Suite回答編
[BurpSuiteJapan]Burp Suite回答編[BurpSuiteJapan]Burp Suite回答編
[BurpSuiteJapan]Burp Suite回答編
 
会社概要_株式会社サーバーワークス
会社概要_株式会社サーバーワークス会社概要_株式会社サーバーワークス
会社概要_株式会社サーバーワークス
 
Data platformdesign
Data platformdesignData platformdesign
Data platformdesign
 
CodePipeline入門
CodePipeline入門CodePipeline入門
CodePipeline入門
 

En vedette

Monocleとかいうのがありまして
MonocleとかいうのがありましてMonocleとかいうのがありまして
MonocleとかいうのがありましてNaoki Aoyama
 
はじめて Phantom と遭遇して、闇雲に闘いを挑んでみた話 #kbkz_tech
はじめて Phantom と遭遇して、闇雲に闘いを挑んでみた話 #kbkz_techはじめて Phantom と遭遇して、闇雲に闘いを挑んでみた話 #kbkz_tech
はじめて Phantom と遭遇して、闇雲に闘いを挑んでみた話 #kbkz_techTomohiro Kumagai
 
MySQL 5.7 InnoDB 日本語全文検索(その2)
MySQL 5.7 InnoDB 日本語全文検索(その2)MySQL 5.7 InnoDB 日本語全文検索(その2)
MySQL 5.7 InnoDB 日本語全文検索(その2)yoyamasaki
 
楕円曲線入門 トーラスと楕円曲線のつながり
楕円曲線入門トーラスと楕円曲線のつながり楕円曲線入門トーラスと楕円曲線のつながり
楕円曲線入門 トーラスと楕円曲線のつながりMITSUNARI Shigeo
 
Enduring CSS
Enduring CSSEnduring CSS
Enduring CSSTakazudo
 
PHPでスマホアプリにプッシュ通知する
PHPでスマホアプリにプッシュ通知するPHPでスマホアプリにプッシュ通知する
PHPでスマホアプリにプッシュ通知するTomoki Hasegawa
 
Kubernetes in 30 minutes (2017/03/10)
Kubernetes in 30 minutes (2017/03/10)Kubernetes in 30 minutes (2017/03/10)
Kubernetes in 30 minutes (2017/03/10)lestrrat
 
Neo4jで始めるグラフDB入門 - LT Thursday
Neo4jで始めるグラフDB入門 - LT ThursdayNeo4jで始めるグラフDB入門 - LT Thursday
Neo4jで始めるグラフDB入門 - LT ThursdayYusuke Komahara
 
実務者のためのかんたんScalaz
実務者のためのかんたんScalaz実務者のためのかんたんScalaz
実務者のためのかんたんScalazTomoharu ASAMI
 
フロントエンドで GraphQLを使った所感
フロントエンドで GraphQLを使った所感フロントエンドで GraphQLを使った所感
フロントエンドで GraphQLを使った所感Chao Li
 
SparkとJupyterNotebookを使った分析処理 [Html5 conference]
SparkとJupyterNotebookを使った分析処理 [Html5 conference]SparkとJupyterNotebookを使った分析処理 [Html5 conference]
SparkとJupyterNotebookを使った分析処理 [Html5 conference]Tanaka Yuichi
 
Performance optimisation with GraphQL
Performance optimisation with GraphQLPerformance optimisation with GraphQL
Performance optimisation with GraphQLyann_s
 
リテラルと型の続きの話 #__swift__
リテラルと型の続きの話 #__swift__リテラルと型の続きの話 #__swift__
リテラルと型の続きの話 #__swift__Tomohiro Kumagai
 
Apache Sparkを使った感情極性分析
Apache Sparkを使った感情極性分析Apache Sparkを使った感情極性分析
Apache Sparkを使った感情極性分析Tanaka Yuichi
 
Prefer Cloud Platform - ビジョン、アーキテクチャ
Prefer Cloud Platform - ビジョン、アーキテクチャPrefer Cloud Platform - ビジョン、アーキテクチャ
Prefer Cloud Platform - ビジョン、アーキテクチャTomoharu ASAMI
 
PostgreSQL画像データ収集・格納
PostgreSQL画像データ収集・格納PostgreSQL画像データ収集・格納
PostgreSQL画像データ収集・格納Ayumi Ishii
 

En vedette (20)

Monocleとかいうのがありまして
MonocleとかいうのがありましてMonocleとかいうのがありまして
Monocleとかいうのがありまして
 
はじめて Phantom と遭遇して、闇雲に闘いを挑んでみた話 #kbkz_tech
はじめて Phantom と遭遇して、闇雲に闘いを挑んでみた話 #kbkz_techはじめて Phantom と遭遇して、闇雲に闘いを挑んでみた話 #kbkz_tech
はじめて Phantom と遭遇して、闇雲に闘いを挑んでみた話 #kbkz_tech
 
MySQL 5.7 InnoDB 日本語全文検索(その2)
MySQL 5.7 InnoDB 日本語全文検索(その2)MySQL 5.7 InnoDB 日本語全文検索(その2)
MySQL 5.7 InnoDB 日本語全文検索(その2)
 
Impression of realm java
Impression of realm javaImpression of realm java
Impression of realm java
 
LTE Air Interface
LTE Air InterfaceLTE Air Interface
LTE Air Interface
 
楕円曲線入門 トーラスと楕円曲線のつながり
楕円曲線入門トーラスと楕円曲線のつながり楕円曲線入門トーラスと楕円曲線のつながり
楕円曲線入門 トーラスと楕円曲線のつながり
 
Enduring CSS
Enduring CSSEnduring CSS
Enduring CSS
 
Vue.js with Go
Vue.js with GoVue.js with Go
Vue.js with Go
 
Rの高速化
Rの高速化Rの高速化
Rの高速化
 
PHPでスマホアプリにプッシュ通知する
PHPでスマホアプリにプッシュ通知するPHPでスマホアプリにプッシュ通知する
PHPでスマホアプリにプッシュ通知する
 
Kubernetes in 30 minutes (2017/03/10)
Kubernetes in 30 minutes (2017/03/10)Kubernetes in 30 minutes (2017/03/10)
Kubernetes in 30 minutes (2017/03/10)
 
Neo4jで始めるグラフDB入門 - LT Thursday
Neo4jで始めるグラフDB入門 - LT ThursdayNeo4jで始めるグラフDB入門 - LT Thursday
Neo4jで始めるグラフDB入門 - LT Thursday
 
実務者のためのかんたんScalaz
実務者のためのかんたんScalaz実務者のためのかんたんScalaz
実務者のためのかんたんScalaz
 
フロントエンドで GraphQLを使った所感
フロントエンドで GraphQLを使った所感フロントエンドで GraphQLを使った所感
フロントエンドで GraphQLを使った所感
 
SparkとJupyterNotebookを使った分析処理 [Html5 conference]
SparkとJupyterNotebookを使った分析処理 [Html5 conference]SparkとJupyterNotebookを使った分析処理 [Html5 conference]
SparkとJupyterNotebookを使った分析処理 [Html5 conference]
 
Performance optimisation with GraphQL
Performance optimisation with GraphQLPerformance optimisation with GraphQL
Performance optimisation with GraphQL
 
リテラルと型の続きの話 #__swift__
リテラルと型の続きの話 #__swift__リテラルと型の続きの話 #__swift__
リテラルと型の続きの話 #__swift__
 
Apache Sparkを使った感情極性分析
Apache Sparkを使った感情極性分析Apache Sparkを使った感情極性分析
Apache Sparkを使った感情極性分析
 
Prefer Cloud Platform - ビジョン、アーキテクチャ
Prefer Cloud Platform - ビジョン、アーキテクチャPrefer Cloud Platform - ビジョン、アーキテクチャ
Prefer Cloud Platform - ビジョン、アーキテクチャ
 
PostgreSQL画像データ収集・格納
PostgreSQL画像データ収集・格納PostgreSQL画像データ収集・格納
PostgreSQL画像データ収集・格納
 

Similaire à Phantom Type in Scala

How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜Hiromi Ishii
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行guest5f4320
 
Scalamacrosについて
ScalamacrosについてScalamacrosについて
Scalamacrosについてdekosuke
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタートShumpei Shiraishi
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックスTomoharu ASAMI
 
Scala EE 7 Essentials
Scala EE 7 EssentialsScala EE 7 Essentials
Scala EE 7 Essentialstnoda
 
What Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットWhat Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットTaisuke Oe
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexprGenya Murakami
 
Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009Taisuke Shiratori
 
Scalaで型クラス入門
Scalaで型クラス入門Scalaで型クラス入門
Scalaで型クラス入門Makoto Fukuhara
 
Introduction to Spray at Kansai Functional Programming
Introduction to Spray at Kansai Functional ProgrammingIntroduction to Spray at Kansai Functional Programming
Introduction to Spray at Kansai Functional ProgrammingSuguru Hamazaki
 
オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional ProgrammingTomoharu ASAMI
 
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発Kentaro Ohkouchi
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめYu Nobuoka
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Naoki Aoyama
 
JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1Susisu
 
Enumはデキる子 ~ case .Success(let value): ~
 Enumはデキる子 ~ case .Success(let value): ~ Enumはデキる子 ~ case .Success(let value): ~
Enumはデキる子 ~ case .Success(let value): ~Takaaki Tanaka
 

Similaire à Phantom Type in Scala (20)

How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行
 
Scala2.8への移行
Scala2.8への移行Scala2.8への移行
Scala2.8への移行
 
MoteMote Compiler Plugin
MoteMote Compiler PluginMoteMote Compiler Plugin
MoteMote Compiler Plugin
 
Scalamacrosについて
ScalamacrosについてScalamacrosについて
Scalamacrosについて
 
JavaScriptクイックスタート
JavaScriptクイックスタートJavaScriptクイックスタート
JavaScriptクイックスタート
 
Scalaプログラミング・マニアックス
Scalaプログラミング・マニアックスScalaプログラミング・マニアックス
Scalaプログラミング・マニアックス
 
Scala EE 7 Essentials
Scala EE 7 EssentialsScala EE 7 Essentials
Scala EE 7 Essentials
 
What Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットWhat Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミット
 
中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr中3女子が狂える本当に気持ちのいい constexpr
中3女子が狂える本当に気持ちのいい constexpr
 
Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009
 
Scalaで型クラス入門
Scalaで型クラス入門Scalaで型クラス入門
Scalaで型クラス入門
 
Introduction to Spray at Kansai Functional Programming
Introduction to Spray at Kansai Functional ProgrammingIntroduction to Spray at Kansai Functional Programming
Introduction to Spray at Kansai Functional Programming
 
Trait in scala
Trait in scalaTrait in scala
Trait in scala
 
オブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programmingオブジェクト指向開発におけるObject-Functional Programming
オブジェクト指向開発におけるObject-Functional Programming
 
EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発EC-CUBE + PHPUnit で 実践テスト駆動開発
EC-CUBE + PHPUnit で 実践テスト駆動開発
 
TypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめTypeScript 言語処理系ことはじめ
TypeScript 言語処理系ことはじめ
 
Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術Scala の関数型プログラミングを支える技術
Scala の関数型プログラミングを支える技術
 
JavaScript 講習会 #1
JavaScript 講習会 #1JavaScript 講習会 #1
JavaScript 講習会 #1
 
Enumはデキる子 ~ case .Success(let value): ~
 Enumはデキる子 ~ case .Success(let value): ~ Enumはデキる子 ~ case .Success(let value): ~
Enumはデキる子 ~ case .Success(let value): ~
 

Dernier

IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxAtomu Hidaka
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdffurutsuka
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000Shota Ito
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Danieldanielhu54
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directoryosamut
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。iPride Co., Ltd.
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムsugiuralab
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略Ryo Sasaki
 

Dernier (9)

IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptxIoT in the era of generative AI, Thanks IoT ALGYAN.pptx
IoT in the era of generative AI, Thanks IoT ALGYAN.pptx
 
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
Amazon SES を勉強してみる その12024/04/12の勉強会で発表されたものです。
 
UPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdfUPWARD_share_company_information_20240415.pdf
UPWARD_share_company_information_20240415.pdf
 
PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000PHP-Conference-Odawara-2024-04-000000000
PHP-Conference-Odawara-2024-04-000000000
 
Postman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By DanielPostman LT Fukuoka_Quick Prototype_By Daniel
Postman LT Fukuoka_Quick Prototype_By Daniel
 
20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory20240412_HCCJP での Windows Server 2025 Active Directory
20240412_HCCJP での Windows Server 2025 Active Directory
 
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
新人研修のまとめ       2024/04/12の勉強会で発表されたものです。新人研修のまとめ       2024/04/12の勉強会で発表されたものです。
新人研修のまとめ 2024/04/12の勉強会で発表されたものです。
 
スマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システムスマートフォンを用いた新生児あやし動作の教示システム
スマートフォンを用いた新生児あやし動作の教示システム
 
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
[DevOpsDays Tokyo 2024] 〜デジタルとアナログのはざまに〜 スマートビルディング爆速開発を支える 自動化テスト戦略
 

Phantom Type in Scala

  • 1. Phantom Type in Scala ファントムタイプ社の社長にみんなでPhatom Typeを教える会 2012.10.06 前田康行(@maeda_)
  • 2. 自己紹介 •  前⽥田康⾏行行 (@maeda_ ) •  好きな⾔言語 •  Scala •  Smalltalk •  DyNagoya (Dynamic language + Nagoya) •  http://dynagoya.info
  • 3. About Phatom Type A phantom type is a parametrised type whose parameters do not all appear on the right-hand side of its definition - Haskell wiki より抜粋 - http://www.haskell.org/haskellwiki/Phantom_type
  • 4. 幽霊型の例 •  型パラメータTはcase classのフィールドに使われて いない case class A[T](x : Int) scala> A[String](3) res0: A [String] = A(3) scala> A [List[Char]](3) res1: A [List[Char]] = A(3) scala> res0 == res1 res2: Boolean = true •  特にScalaの場合、Type Erasureにより実⾏行行時に型パ ラメータは消える
  • 5. Phantom Typeは幽霊なのか? •  Phantom Type(幽霊型)は •  実⾏行行時ではなく、コンパイル時にのみ暗躍する。 •  条件を満たさないと、コンパイルエラーにして実⾏行行 できなくする呪いをかける •  コンパイルが通ると成仏していなくなる •  これは幽霊ですね
  • 6. Phatom Typeの実用例 1 Type Safeな構文木 •  Expr[T]は評価結果がT型となることを表す trait Expr[T] case object True extends Expr[Boolean] case object False extends Expr [Boolean] case class Number(x: Int) extendsExpr [Int] case class Plus(x1: Expr [Int], x2:Expr [Int]) extends Expr [Int] scala> Plus(Plus(Number(3),Number(4)),Number(5)) res4: Plus = Plus(Plus(Number(3),Number(4)),Number(5)) scala> Plus(Plus(Number(3), Number(4)), True) // PlusにBooleanは渡せない <console>:14: error: type mismatch; found : True.type required: Expr[Int] Plus(Plus(Number(3), Number(4)), True)
  • 7. Phatom Typeの実用例 2 状態を表す(定義) sealed trait State class Empty private () extends State class Ready private () extends State class Dinner[Oeuvre <: State, MainDish <: State, Dessert <: State] (){ def cookSalad = new Dinner[Ready, MainDish, Dessert] def cookSoup = new Dinner[Ready, MainDish, Dessert] def cookSteak = new Dinner[Oeuvre, Ready, Dessert] def cookCake = new Dinner[Oeuvre, MainDish, Ready] def serve() = println("Now you can eat!") } object Dinner{ def start = new Dinner[Empty, Empty, Empty] }
  • 8. Phatom Typeの実用例 2 状態を表す(実行例) scala> Dinner.start res0: Dinner[Empty, Empty, Empty] = Dinner@4b401150 scala> Dinner.start.cookSalad.cookCake res1: Dinner[Ready, Empty, Ready] = Dinner@6d9e4f58 scala> Dinner.start.cookSalad.cookCake.serve() Now you can eat! scala> Dinner.start.cookSalad.cookSteak.cookSoup.serve() Now you can eat!
  • 11. implicit parameterの例 // implicit parameter付きの関数の宣⾔言 scala> def func(implicit ev: Int) = m // implicit parameterが⾒見見つからないのでエラー scala> func <console>:9: error: could not find implicit value for parameter m: Int // スコープ内にimplicitで宣⾔言した値があると、⾃自動的に渡される scala> implicit val v = 3 scala> func // → 3 •  スコープ内のimplicitで宣⾔言された値の中で、 型が合う値をコンパイル時に探索する
  • 12. 多相的なimplicit parameter scala> def implicitly[T](implicit ev: T) = m scala> implicit val v = 3 scala> implicitly[Int]         // → 3 scala> implicitly[String]      // →  コンパイルエラー •  implicitlyメソッドはPredefに標準で定義されている •  型パラメータで指定された型のimplicitに取得できる 値を探索
  • 13. もう少しお行儀よく class Tag[A]() def func[A](implicit ev: Tag[A]) = "OK implicit val intAllowed = new Tag[Int] scala> func[Int] // → OK scala> func[String] // →コンパイルエラー •  普通に使う型をimplicitで宣⾔言するのはよくない •  implicitで使⽤用するための型を⽤用意して、その型 パラメータで特定の型を指定する⽅方がいい
  • 14. 型パラメータを2つにする class Tag[A, B] () def func[A, B](implicit ev: Tag[A, B]) = "OK" implicit val intAllowed = new Tag[Int, Int] implicit val stringAllowed = new Tag[String, String] scala> func[Int, Int] // OK scala> func[Int, String] // コンパイルエラー •  個別に使⽤用可能な型の組み合わせをimplicitで宣 ⾔言する
  • 15. 任意の2つの型が同じである ことを表現したい •  型パラメータを持った値は扱えない implicit val x[A] = new Tag[A, A] •  メソッドなら型パラメータを持てる ○ implicit def f[A] = new Tag[A, A]
  • 16. 2つの型が同じ場合 呼び出し可能な関数 class Tag[A, B] () implicit def equalAllowed[A] = new Tag[A, A] def func[A, B](implicit ev: Tag[A, B]) = "OK scala> func[Int, Int] // → OK scala> func[Int, String] // → コンパイルエラー
  • 17. インスタンス生成の無駄を省く class Tag[A, B] () val singletonTag = new Tag[Any, Any] implicit def equalAllowed[A]: Tag[A, A] = singletonTag.asInstanceOf[Tag[A, A]] def func[A, B](implicit ev: Tag[A, B]) = "OK" •  implicitで呼び出される度にインスタンス⽣生成するのは無駄 •  implicitで渡される値は使われないので、型さえあえば、中 ⾝身はなんでもいい •  nullでもOK
  • 18. 2つの型パラメータをとる型の シンタックスシュガー scala> class Op[A, B] () scala> val x: Op[Int, String] = new Op x: Op[Int,String] = Op@ab612f8 scala> val x: Int Op String = new Op x: Op[Int,String] = Op@165e6c89 •  中置記法の⽅方が型の演算⼦子っぽく⾒見見える •  クラス名に記号も使える。記号の⽅方がより演算⼦子っぽい
  • 19. Scala 2.10-M7の実装 sealed abstract class =:=[From, To]                   extends (From => To) with Serializable private[this] final val singleton_=:= = new =:=[Any,Any] { def apply(x: Any): Any = x } object =:= { implicit def tpEquals[A]: A =:= A = singleton_=:=.asInstanceOf[A =:= A] } •  From => To を継承しているため、型を変換する関数とし て使える def func[A](x1: A)(implicit w: A =:= B ) = { val x2 = w(x1) // x2はB型として使える ... } •  Serializableを継承している利⽤用は不明
  • 20. generalized type constraints scala> implicitly[Int =:= Int] res7: =:=[Int,Int] = <function1> scala> implicitly[Int =:= String] <console>:9: error: Cannot prove that Int =:= String. implicitly[Int =:= String] ^ •  異なる型を渡すとコンパイルエラー
  • 22. 証明は身近な存在 •  カリー・ハワード同型対応 •  型 ⇆ 命題 •  プログラム ⇆ 証明 •  プログラムに型が付く ⇆ 命題が証明された •  「A =:= B」型について、それを満たすimplicitをコ ンパイラが⾒見見つけて、型が付けば、「AがBであるこ と」が証明されている
  • 23. 定理証明支援器 Coq •  型の表現⼒力力がすごい 例:迷路の経路が最短経路である型 http://d.hatena.ne.jp/yoshihiro503/20100119 •  そんな型を満たすようなプログラムを書くのは⼤大 変 •  Coqは⼈人にやさしい形で⽀支援してくれる
  • 24. 一方、Scalaは •  型レベルλ計算 http://apocalisp.wordpress.com/ 2010/06/08/type-level-programming-in- scala/ •  型レベル命題論理 http://www.chuusai.com/2011/06/09/scala- union-types-curry-howard/ •  ⼀一応、がんばれば、、、
  • 25. まとめ •  Phantom Type(幽霊型)はコンパイル時に暗躍 •  使いこなすには型レベルでいろいろやりたくなる •  Scalaでは、implicit parameterを利⽤用して、コ ンパイル時にいろいろできる •  Coqすごい
  • 26. もっと型の力を知りたい人は •  ProofCafe(毎⽉月第4⼟土曜) •  名古屋でプログラムの証明について勉強する勉強会で す。現在はソフトウェアの基礎というドキュメントを 読んでいます。コーヒーを飲みながら楽しく証明しま しょう。 http://proofcafe.org/wiki/ •  TAPL-nagoya (毎⽉月第3⼟土曜) •  ScalaやF#やSML#などの静的型付け⾔言語の基礎に なっている型理論についての勉強会です。英語ですが、 説明が丁寧で例が豊富な TAPL をみんなで読みます。 •  http://proofcafe.org/tapl/
  • 28. <%< はなくなった (2.10から) •  「A => B」でOK scala> implicitly[ Int <%< Long ] <console>:12: error: not found: type >%> implicitly[ Int <%< Long ] ^ scala> implicitly[ Int => Long ] res5: Int => Long = <function1>
  • 29. <%<は、なぜなくなったのか •  SI-2781 •  type inference constraints should be carried along during search for chained implicits •  https://issues.scala-lang.org/browse/ SI-2781
  • 30. 演習問題 1 •  9ページの例をコンパイルエラーを出すようにする scala> Dinner.start.cookSalad.cookCake.serve() <console>:8: error: Cannot prove that Dinner.Empty =:= Dinner.Ready. Dinner.start.cookSalad.cookCake.serve() ^ scala> Dinner.start.cookSalad.cookCake.cookSalad <console>:8: error: Cannot prove that Dinner.Ready =:= Dinner.Empty. Dinner.start.cookSalad.cookCake.cookSalad ^ scala> Dinner.start.cookSalad.cookCake.cookSteak.serve() Now you can eat!
  • 31. 演習問題 2 •  AがBの⼦子クラスであるかをチェックする型を考えてみる scala> trait A scala> trait B with A scala> implicitly[ B <:< A ] res9: <:<[B,A] = <function1> scala> implicitly[ A <:< B ] <console>:14: error: Cannot prove that A <:< B. implicitly[ A <:< B ]
  • 32. 参考文献 •  Type classes as objects and implicitsBruno C.d.S. Oliveira, Adriaan Moors, Martin Odersky OOPSLA ʻ‘10 Proceedings of the ACM international conference on Object oriented programming systems languages and applications, 2010 この論⽂文の「6.6 Encoding generalized constraints」に>:>の話がある(少しだけど)