SlideShare a Scribd company logo
1 of 42
Scalaで学ぶ関数型言語超入門
〜関数型言語の魅力〜
はじめに
素数アルゴリズムで見る
オブジェクト指向言語との違い
エラトステネスの篩って?
• 素数を求めるときに使うアルゴリズム
• プログラミングの問題なんかによくでてくる
• 古代ギリシャの数学者であるエラトステネス
が考案したのでこう呼ばれている。
内容
• 整数のリストに2からxまでの数を入れる
• リストの先頭に行き、その数の倍数をふるい
落とす。
• リストの先頭の値がxの平方根になるまで繰
り返す。
ベリーシンプル!!!!!
では早速コードを見てみましょう!
Javaでの実装例
少しごちゃごちゃしていますね・・・
Oh No!
ではこれをScalaで書くと・・・・?
Scalaでの実装例
たったこれだけ!?
比較
Java Scala
すばらしい!!!
なぜこんな魔法のようなことができる
のか?
どうしてこんなに短く書けるのか?
気になりませんか?
空気読んで!
勿論気になりますよね??
それではご説明いたしましょう!
ようこそ!
関数型の世界へ!
関数型言語について
〜関数型言語の種類や利点、特徴〜
そもそも“関数型言語”って何ぞや?
関数型言語とは!
関数型プログラミングに向いた特徴を持つプログラミング言語、
関数型プログラミング言語である!
引数に関数を作用させて計算をおこなうことから、作用型言語
ともいう!
(Wikipediaより抜粋)
はい?
どういうこと?
関数型言語の特徴
• 基本的に値がイミュータブルである(変更不能)
• 関数がファーストクラスオブジェクトである
• 高階関数
• 関数の部分適用、カリー化
• 遅延評価
• Option型
• 再帰
• 型推論
• 関数が副作用を持たない(純粋関数型)
関数型言語ってどんなんがあんの?
代表的な関数型言語
• 純粋関数型言語
• Haskell
• Miranda
• 非純粋関数型言語
• ML
• Scala
• OCaml
• Erlang
• Swift(?)
じゃあ関数型言語を使うと何が嬉しいの?
関数型言語のメリットその1
実行時エラーが圧倒的に少ない
実行時エラーが少ない
• 基本的にコンパイル時にほとんどのエラーを
検出してくれる。
• Option型の使用により、ぬるぽで落ちる事は
全くない(多少意識してコーディングする必要
はある)
• 値が変更不能、また関数が細かいのでバグ
が発見しやすい
コードが短く、シンプルになる
関数型言語のメリットその2
コードが短くシンプルになる
• 関数を処理毎に細かく分け、それをつなげた
り合成したりしてプログラミングしていくので、
コードが短くてすむ。
• 上で説明したように大きな関数も、細かい関
数から成り立っているのでいくつか関数を理
解すれば他の関数もスッと理解していく事が
できる。
関数型言語のメイン、関数について
〜関数と高階関数〜
関数の特徴
• 同じ入力に対して必ず同じ出力を返す。
• 関数は変数と同じく引数や戻り値として扱う
事ができる。
• また、変数に格納する事も、関数同士を足し
合わせて新しい関数を作る事も可能
オブジェクト指向のメソッドにくらべて
非常に柔軟性が高いです!
じゃあ高階関数って?
後悔→
高階関数とは?
• 引数に関数を取ったり、戻り値として関数を
返す関数の事。
• 代表的な高階関数にmap、filter、foreachなど
がある
mapを使った例を見てみましょう!
これが高階関数(map)だ!
なんだか地味ですね(; ^ω^)
解説!
• mapとはコレクションの中身を第一引数にとり、
関数を第2引数にとる高階関数です。
• ここではリストの中身をすべて2倍しています
まとめ
• 関数型言語は小さな関数を組み合わせてプ
ログラミングしていく!
• 関数の柔軟性が高いので、複雑な処理もシ
ンプルに書ける!
• コードの記述量が減る!
• 実行時エラーがほとんどない!
• 読みやすい!
• 高階関数はとても重要!
まとめ2
Scala最高!!!!!
これを期にぜひ関数型言語を触って
みてください!
ご清聴ありがとうございました!

More Related Content

What's hot

磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!Ra Zon
 
関数型もモナドも分からなくてもScalaと言う言語は便利らしい
関数型もモナドも分からなくてもScalaと言う言語は便利らしい関数型もモナドも分からなくてもScalaと言う言語は便利らしい
関数型もモナドも分からなくてもScalaと言う言語は便利らしいke-m kamekoopa
 
数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由Hiromi Ishii
 
Scalaで学ぶ関数型超入門
Scalaで学ぶ関数型超入門Scalaで学ぶ関数型超入門
Scalaで学ぶ関数型超入門Yuichiro Takahashi
 
Dark vol4 for_slideshare
Dark vol4 for_slideshareDark vol4 for_slideshare
Dark vol4 for_slideshareara_ta3
 
Scala.js触ってみた
Scala.js触ってみたScala.js触ってみた
Scala.js触ってみたAsami Abe
 
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)parrotstudio
 
ScalaでBacklogの通知bot作ったで
ScalaでBacklogの通知bot作ったでScalaでBacklogの通知bot作ったで
ScalaでBacklogの通知bot作ったでAsami Abe
 
Lets scala
Lets scalaLets scala
Lets scalasmdkk
 
Rxjavaとoptionalで関数型androidしよう
Rxjavaとoptionalで関数型androidしようRxjavaとoptionalで関数型androidしよう
Rxjavaとoptionalで関数型androidしようFumihiko Shiroyama
 
Swiftで、かなり微妙な型クラス
Swiftで、かなり微妙な型クラスSwiftで、かなり微妙な型クラス
Swiftで、かなり微妙な型クラスNobukazu Hanada
 
Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009Taisuke Shiratori
 
Quasar: Actor Model and Light Weight Threads on Java
Quasar: Actor Model and Light Weight Threads on JavaQuasar: Actor Model and Light Weight Threads on Java
Quasar: Actor Model and Light Weight Threads on JavaTaku Miyakawa
 

What's hot (20)

Scala is-unscared
Scala is-unscaredScala is-unscared
Scala is-unscared
 
こわくないScala
こわくないScalaこわくないScala
こわくないScala
 
磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!
 
関数型もモナドも分からなくてもScalaと言う言語は便利らしい
関数型もモナドも分からなくてもScalaと言う言語は便利らしい関数型もモナドも分からなくてもScalaと言う言語は便利らしい
関数型もモナドも分からなくてもScalaと言う言語は便利らしい
 
Scalaノススメ
ScalaノススメScalaノススメ
Scalaノススメ
 
数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由数学プログラムを Haskell で書くべき 6 の理由
数学プログラムを Haskell で書くべき 6 の理由
 
Scalaで学ぶ関数型超入門
Scalaで学ぶ関数型超入門Scalaで学ぶ関数型超入門
Scalaで学ぶ関数型超入門
 
Phantom Type in Scala
Phantom Type in ScalaPhantom Type in Scala
Phantom Type in Scala
 
Dark vol4 for_slideshare
Dark vol4 for_slideshareDark vol4 for_slideshare
Dark vol4 for_slideshare
 
Lecture1
Lecture1Lecture1
Lecture1
 
Scala.js触ってみた
Scala.js触ってみたScala.js触ってみた
Scala.js触ってみた
 
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
 
ScalaでBacklogの通知bot作ったで
ScalaでBacklogの通知bot作ったでScalaでBacklogの通知bot作ったで
ScalaでBacklogの通知bot作ったで
 
Lets scala
Lets scalaLets scala
Lets scala
 
Rxjavaとoptionalで関数型androidしよう
Rxjavaとoptionalで関数型androidしようRxjavaとoptionalで関数型androidしよう
Rxjavaとoptionalで関数型androidしよう
 
Swiftで、かなり微妙な型クラス
Swiftで、かなり微妙な型クラスSwiftで、かなり微妙な型クラス
Swiftで、かなり微妙な型クラス
 
Scalalr
ScalalrScalalr
Scalalr
 
Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009Beginners Scala in FAN 20121009
Beginners Scala in FAN 20121009
 
Quasar: Actor Model and Light Weight Threads on Java
Quasar: Actor Model and Light Weight Threads on JavaQuasar: Actor Model and Light Weight Threads on Java
Quasar: Actor Model and Light Weight Threads on Java
 
Currying
CurryingCurrying
Currying
 

Similar to Scalaで学ぶ関数型言語超入門

Flang kkd1
Flang kkd1Flang kkd1
Flang kkd1florets1
 
頑張りすぎないScala
頑張りすぎないScala頑張りすぎないScala
頑張りすぎないScalatakezoe
 
Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]Ra Zon
 
Scala勉強会_2014_11_18
Scala勉強会_2014_11_18Scala勉強会_2014_11_18
Scala勉強会_2014_11_18Shuya Tsukamoto
 
演習:プログラミング言語処理をやってみよう
演習:プログラミング言語処理をやってみよう演習:プログラミング言語処理をやってみよう
演習:プログラミング言語処理をやってみようTakashi Ishio
 
演習:プログラミング言語処理をやってみよう (ver.1.01)
演習:プログラミング言語処理をやってみよう (ver.1.01)演習:プログラミング言語処理をやってみよう (ver.1.01)
演習:プログラミング言語処理をやってみよう (ver.1.01)Takashi Ishio
 
Scala基礎勉強会 懇親会LT
Scala基礎勉強会 懇親会LTScala基礎勉強会 懇親会LT
Scala基礎勉強会 懇親会LTpocketberserker
 
javaによる探索アルゴリズムとリスト探索
javaによる探索アルゴリズムとリスト探索javaによる探索アルゴリズムとリスト探索
javaによる探索アルゴリズムとリスト探索RabbitFoot141
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Ra Zon
 
ナイーブツリーの入れ子集合
ナイーブツリーの入れ子集合ナイーブツリーの入れ子集合
ナイーブツリーの入れ子集合Akura Pi
 
パーフェクト"Elixir情報収集"
パーフェクト"Elixir情報収集"パーフェクト"Elixir情報収集"
パーフェクト"Elixir情報収集"Keisuke Takahashi
 
Shibuya.lisp #28: 仮題: R について
Shibuya.lisp #28: 仮題: R についてShibuya.lisp #28: 仮題: R について
Shibuya.lisp #28: 仮題: R についてtnoda
 
No more Legacy documents
No more Legacy documentsNo more Legacy documents
No more Legacy documentsbleis tift
 
Linq to XXXX(Reactive Extensionsの紹介)
Linq to XXXX(Reactive Extensionsの紹介)Linq to XXXX(Reactive Extensionsの紹介)
Linq to XXXX(Reactive Extensionsの紹介)Hiroshi Maekawa
 

Similar to Scalaで学ぶ関数型言語超入門 (15)

Flang kkd1
Flang kkd1Flang kkd1
Flang kkd1
 
頑張りすぎないScala
頑張りすぎないScala頑張りすぎないScala
頑張りすぎないScala
 
Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]Scalaで萌える関数型プログラミング[エッセンシャル版]
Scalaで萌える関数型プログラミング[エッセンシャル版]
 
Scala勉強会_2014_11_18
Scala勉強会_2014_11_18Scala勉強会_2014_11_18
Scala勉強会_2014_11_18
 
演習:プログラミング言語処理をやってみよう
演習:プログラミング言語処理をやってみよう演習:プログラミング言語処理をやってみよう
演習:プログラミング言語処理をやってみよう
 
演習:プログラミング言語処理をやってみよう (ver.1.01)
演習:プログラミング言語処理をやってみよう (ver.1.01)演習:プログラミング言語処理をやってみよう (ver.1.01)
演習:プログラミング言語処理をやってみよう (ver.1.01)
 
Scala基礎勉強会 懇親会LT
Scala基礎勉強会 懇親会LTScala基礎勉強会 懇親会LT
Scala基礎勉強会 懇親会LT
 
Scala入門
Scala入門Scala入門
Scala入門
 
javaによる探索アルゴリズムとリスト探索
javaによる探索アルゴリズムとリスト探索javaによる探索アルゴリズムとリスト探索
javaによる探索アルゴリズムとリスト探索
 
Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]Scalaで萌える関数型プログラミング[1.1.RC1]
Scalaで萌える関数型プログラミング[1.1.RC1]
 
ナイーブツリーの入れ子集合
ナイーブツリーの入れ子集合ナイーブツリーの入れ子集合
ナイーブツリーの入れ子集合
 
パーフェクト"Elixir情報収集"
パーフェクト"Elixir情報収集"パーフェクト"Elixir情報収集"
パーフェクト"Elixir情報収集"
 
Shibuya.lisp #28: 仮題: R について
Shibuya.lisp #28: 仮題: R についてShibuya.lisp #28: 仮題: R について
Shibuya.lisp #28: 仮題: R について
 
No more Legacy documents
No more Legacy documentsNo more Legacy documents
No more Legacy documents
 
Linq to XXXX(Reactive Extensionsの紹介)
Linq to XXXX(Reactive Extensionsの紹介)Linq to XXXX(Reactive Extensionsの紹介)
Linq to XXXX(Reactive Extensionsの紹介)
 

Scalaで学ぶ関数型言語超入門