Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
第二回だか第三回だか
tento.tech定例会
自己紹介
• 鈴木颯介
• tento.tech広報
• 高校一年生
• @tako_programing
前回から一ヶ月間何をやっていたのか
• 一時期収まっていたscala欲が再熱してscalascalaし
ていた。
• 技術書を衝動買いして適当に読み進めては積んでい
た(プログラミングelixirなど)
• フロントエンド界隈の常識が若干ついて...
前回から一ヶ月間何をやっていたのか
• ReactできないけどReact/ReactNative入門者の会とか
に参加してた。
• scalatraの練習とかでディズニーの待ち時間を返すAPI
を作ったり。(完成してないよ)
• 関数型言語尊い...
scalaはイイぞ
別にscalaにめちゃくちゃ詳しいわけではないけど
やはりscalaが好きなので、scalaの話をします
scalaはイイぞ
オブジェクト指向関数型プログラミング言語
JVMで動作するのでJavaのライブラリが使えます
強い静的型付け(良い)
型推論もあるよ(haskellとかMLよろしくのhindley
milnerアルゴリズムではない)
Jav...
scalaはイイぞ
今回は型推論について少しだけ
サンプルを交えて解説するよ
scalaの型推論
ScalaのListには、2つの要素を比較する
(T, T) => Boolean
の関数を引数にとりソートする関数、
sortWithが定義されています。
簡単なリストのソートの例
scalaの型推論
次にListの外に(T, T)=>Booleanの関数と任意のList[T]
をとってさっきと同じようにソートする関数msortを定義
しますね。これは有名なソートアルゴリズムで、
「scala マージソート」とかでググれば...
scalaの型推論
msortでさっきのsortWithと同じことをしようとすると
こういう感じになります。
scalaの型推論
msortの第一引数はなんでこんな長くなるの?
scalaの型推論
msortはカリー化された関数
↓
第一引数に(T, T) => Booleanの関数を受けると
List[T]を引数にとる関数を返す
※カリー化ってなんだよっていう人は
すごいH本とかコップ本とかを読んでください
scalaの型推論
msortの第一引数に((x: Int, y: Int) => x >y)が渡る
↓
型推論器は「お、Intじゃん、了解。」ってなる。
↓
型推論器は「よしじゃあ次に受け取るのはList[Int]ね」
って上手いこと察してく...
scalaの型推論
msortに(_ > _)が渡る
↓
型推論器は「いやそんないきなり略記法で書かれても
どんな型かわかる訳ないだろ」ってなる
scalaの型推論
ちなみにさっき
って書きましたが
でも推論はしてくれますごめんなさい
scalaの型推論
ちなみにこれ実は、msortの定義の引数の順番を
入れ替えるだけで簡単に解決できます
例えば第一引数でIntのリストが渡されると
推論器は「あ、おっけえInt型ね。」って
(Int, Int)=>Boolean
を引数にとる...
scalaの型推論
畳み込みの例
scalaの型推論
scalaの右畳み込みです
zがアキュムレータ、xsが畳み込むリスト
opを二引数の関数(演算)として畳み込みます
scalaの型推論
flattenLeftというリストのリストをとって
1つに連結して返す関数を定義します。
↑の関数は正常に動きますが、↓の関数は
期待どおりの挙動をしません
scalaの型推論
なんで?
scalaの型推論
xsは任意の型のリストなので、型はList[A]である
zは別の型Bである可能性がある
つまりopは(A, B)=>Bであるといえる。
scalaの型推論
scalaではList()は型情報が何もないとList[Nothing]
であると判断されてしまう
そのため
における演算op(_ ::: _)は
だと判断されてしまう
scalaの型推論
つまり演算opは、任意の型と空リストをとって確実に
空リストを返す意味の分からない演算になってしまう
これの解決策はList[T]のように型アノテーションを
明示的に示すしかないので残念ですね
第一引数を評価してから第二引数...
scalaの型推論
Haskellとかのhindley milner型推論アルゴリズム
のほうが視野は広い(らしい)
のでこういった煩わしさはないらしい
ただ、scalaの型推論アルゴリズムは
オブジェクト指向におけるサブ型の概念を穏便に
扱っ...
おしまい
ちなみに今回の内容はだいたいコップ本に書いてある
のでコップ本をよんでください。
おしまい
ぜひ読もう
Upcoming SlideShare
Loading in …5
×

第3回tento.tech定例会

415 views

Published on

tento.techの第三回だか第二回だか第一回だかわからない定例会のスライドです。Scalaの型推論についての話がメインです。

Published in: Engineering
  • Be the first to comment

  • Be the first to like this

第3回tento.tech定例会

  1. 1. 第二回だか第三回だか tento.tech定例会
  2. 2. 自己紹介 • 鈴木颯介 • tento.tech広報 • 高校一年生 • @tako_programing
  3. 3. 前回から一ヶ月間何をやっていたのか • 一時期収まっていたscala欲が再熱してscalascalaし ていた。 • 技術書を衝動買いして適当に読み進めては積んでい た(プログラミングelixirなど) • フロントエンド界隈の常識が若干ついてきた • 一般常識は欠陥してきた
  4. 4. 前回から一ヶ月間何をやっていたのか • ReactできないけどReact/ReactNative入門者の会とか に参加してた。 • scalatraの練習とかでディズニーの待ち時間を返すAPI を作ったり。(完成してないよ) • 関数型言語尊いと思うけど関数型っぽい書き方ができ ない悩みを抱えてます • あとはガソリンスタンドでガソリン入れたり経由いれ たり灯油いれたりしてた
  5. 5. scalaはイイぞ 別にscalaにめちゃくちゃ詳しいわけではないけど やはりscalaが好きなので、scalaの話をします
  6. 6. scalaはイイぞ オブジェクト指向関数型プログラミング言語 JVMで動作するのでJavaのライブラリが使えます 強い静的型付け(良い) 型推論もあるよ(haskellとかMLよろしくのhindley milnerアルゴリズムではない) Javaにも型推論はあるけど使い方がスマートではない ような気がしてならない
  7. 7. scalaはイイぞ 今回は型推論について少しだけ サンプルを交えて解説するよ
  8. 8. scalaの型推論 ScalaのListには、2つの要素を比較する (T, T) => Boolean の関数を引数にとりソートする関数、 sortWithが定義されています。 簡単なリストのソートの例
  9. 9. scalaの型推論 次にListの外に(T, T)=>Booleanの関数と任意のList[T] をとってさっきと同じようにソートする関数msortを定義 しますね。これは有名なソートアルゴリズムで、 「scala マージソート」とかでググれば多分定義がでてきます
  10. 10. scalaの型推論 msortでさっきのsortWithと同じことをしようとすると こういう感じになります。
  11. 11. scalaの型推論 msortの第一引数はなんでこんな長くなるの?
  12. 12. scalaの型推論 msortはカリー化された関数 ↓ 第一引数に(T, T) => Booleanの関数を受けると List[T]を引数にとる関数を返す ※カリー化ってなんだよっていう人は すごいH本とかコップ本とかを読んでください
  13. 13. scalaの型推論 msortの第一引数に((x: Int, y: Int) => x >y)が渡る ↓ 型推論器は「お、Intじゃん、了解。」ってなる。 ↓ 型推論器は「よしじゃあ次に受け取るのはList[Int]ね」 って上手いこと察してくれてList[Int]を引数にとる関数 が返ってくる。
  14. 14. scalaの型推論 msortに(_ > _)が渡る ↓ 型推論器は「いやそんないきなり略記法で書かれても どんな型かわかる訳ないだろ」ってなる
  15. 15. scalaの型推論 ちなみにさっき って書きましたが でも推論はしてくれますごめんなさい
  16. 16. scalaの型推論 ちなみにこれ実は、msortの定義の引数の順番を 入れ替えるだけで簡単に解決できます 例えば第一引数でIntのリストが渡されると 推論器は「あ、おっけえInt型ね。」って (Int, Int)=>Boolean を引数にとる関数を返してくれるようになる
  17. 17. scalaの型推論 畳み込みの例
  18. 18. scalaの型推論 scalaの右畳み込みです zがアキュムレータ、xsが畳み込むリスト opを二引数の関数(演算)として畳み込みます
  19. 19. scalaの型推論 flattenLeftというリストのリストをとって 1つに連結して返す関数を定義します。 ↑の関数は正常に動きますが、↓の関数は 期待どおりの挙動をしません
  20. 20. scalaの型推論 なんで?
  21. 21. scalaの型推論 xsは任意の型のリストなので、型はList[A]である zは別の型Bである可能性がある つまりopは(A, B)=>Bであるといえる。
  22. 22. scalaの型推論 scalaではList()は型情報が何もないとList[Nothing] であると判断されてしまう そのため における演算op(_ ::: _)は だと判断されてしまう
  23. 23. scalaの型推論 つまり演算opは、任意の型と空リストをとって確実に 空リストを返す意味の分からない演算になってしまう これの解決策はList[T]のように型アノテーションを 明示的に示すしかないので残念ですね 第一引数を評価してから第二引数を引数にとる 関数を返すカリー化の本来は便利なはずの原則 がscalaの型推論においてはちょっとアレ
  24. 24. scalaの型推論 Haskellとかのhindley milner型推論アルゴリズム のほうが視野は広い(らしい) のでこういった煩わしさはないらしい ただ、scalaの型推論アルゴリズムは オブジェクト指向におけるサブ型の概念を穏便に 扱ってくれるんだとか
  25. 25. おしまい ちなみに今回の内容はだいたいコップ本に書いてある のでコップ本をよんでください。
  26. 26. おしまい ぜひ読もう

×