SlideShare a Scribd company logo
1 of 23
Download to read offline
関数型って?
第一回 関数型言語勉強会 大阪

     2012-05-19
関数

!

手続型プログラミングにおける関数
ではない
int main(void) {!
    puts("Hello, World!");!
    return 0;!
}
数学でいう関数

!

入力 x に対して出力 y のただ一つの
値を決定する規則が与えられている
ときにy を x の関数という

!

y = f(x)
関数型言語

!

関数型プログラミングに向いた特徴
をもつプログラミング言語

関数型プログラミング言語

!

共通定義はない
関数型プログラミング

!

「計算とは関数を引数に適用するこ
と」だというプログラミング手法
関数型プログラミングの必要条件 1

!

第一級関数 (first-class function) を扱
えること
第一級関数

!

関数を第一級オブジェクトとして扱
うことができる関数

関数リテラルとも
第一級オブジェクト

!

あるプログラミング言語において、
生成、代入、演算、(引数、戻り値と
しての) 受け渡しといった、その言語
における基本的な操作を制限なしに
利用できる対象のこと
第一級関数

!

プログラムの実行時に生成され、
データ構造に含めることができ、他
の関数の引数として渡したり、戻り
値として返したりすることのできる
関数
高階関数

!

関数を引数にしたり、戻り値にした
りする関数

function each(array, f) {!
  for (var i = 0; i < array.length; i++) {!
     f(array[i]);!
  }!
}
第一級関数

!

理論モデルはλ計算

!

f(x) = x + 1!
λx.x+1!
f(3) = (λx.x+1) 3!
!
なぜλ計算?

!

関数 x + 1 を引数 5 に適用!
関数 x + y を引数 3 に適用!
関数 f(x) を引数 7 に適用!
!

λx.x+a を引数 1 に適用!
関数型プログラミングの必要条件 2

!

参照透過性

(Referential Transparency)

が常に保たれること
参照透過性

!

文脈によらず式の値はその構成要素
(変数や関数など) によってのみ定ま
ること
変数の値は最初に定義した値と常に
同じ

関数は同じ値を引数として与えられ
れば常に同じ値を返す
変数への破壊的代入をしない

すべての式や関数は副作用を持たな
い
命令型脳の疑問

!

!

どうやってプログラミングするの?
副作用

!

• モナド (Monad)

• 純粋性にこだわらず副作用を許容

    • ただし、必要最低限にとどめ、
    局所化する
破壊的代入

!

• 必要になったら新しい値を作る

• 変数は定義するだけ、(再) 代入は
    しない
破壊的代入

!

• ループはどうするの?

    • 再帰

    • 漸化式: an+1 = p an + q!
• i = i + 1 に違和感を覚えませんで
    したか?
参照透過性

• ユニットテスト書きやすい

• 並列処理に向いている

!

第一級関数

• コードが簡潔に

• 関数を共通化しやすい
リストの要素から偶数を取り出
し、昇順にソート

 val l = List(4, 1, 3, 2)!
 l.filter(_ % 2 == 0).sortWith(_ < _)



例えば Java だと?
木虎 直樹 @kitora_naoki


プログラマ & インフラエンジニア


Java, Scala, JavaScript, Python


Linux, Web, AP, RDBMS, MTA, DNS, network


アジャイルサムライ読書会 大阪道場主催

More Related Content

Viewers also liked

OCamlの多相Variant紹介 #fpstudy
OCamlの多相Variant紹介 #fpstudyOCamlの多相Variant紹介 #fpstudy
OCamlの多相Variant紹介 #fpstudy
kyon mm
 
Erlangを触ってみた
Erlangを触ってみたErlangを触ってみた
Erlangを触ってみた
Yoichi Toyota
 
関数型言語初心者の俺がF#触ってみた
関数型言語初心者の俺がF#触ってみた関数型言語初心者の俺がF#触ってみた
関数型言語初心者の俺がF#触ってみた
Takashi Nishisaki
 
F#で学ぶ関数プログラミング入門?
F#で学ぶ関数プログラミング入門?F#で学ぶ関数プログラミング入門?
F#で学ぶ関数プログラミング入門?
pocketberserker
 
FP習熟度レベルとFSharpxのIteratee
FP習熟度レベルとFSharpxのIterateeFP習熟度レベルとFSharpxのIteratee
FP習熟度レベルとFSharpxのIteratee
pocketberserker
 
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
shoma h
 

Viewers also liked (20)

機械学習とデータ分析プロセス
機械学習とデータ分析プロセス機械学習とデータ分析プロセス
機械学習とデータ分析プロセス
 
OCamlの多相Variant紹介 #fpstudy
OCamlの多相Variant紹介 #fpstudyOCamlの多相Variant紹介 #fpstudy
OCamlの多相Variant紹介 #fpstudy
 
今日から始めるClojure
今日から始めるClojure今日から始めるClojure
今日から始めるClojure
 
Material
MaterialMaterial
Material
 
Erlang
ErlangErlang
Erlang
 
Erlangを触ってみた
Erlangを触ってみたErlangを触ってみた
Erlangを触ってみた
 
GHC 6.12.1 マルチコア対応ランタイムシステムについて
GHC 6.12.1 マルチコア対応ランタイムシステムについてGHC 6.12.1 マルチコア対応ランタイムシステムについて
GHC 6.12.1 マルチコア対応ランタイムシステムについて
 
20120519 inverse fizzbuzz を解いてみよう
20120519 inverse fizzbuzz を解いてみよう20120519 inverse fizzbuzz を解いてみよう
20120519 inverse fizzbuzz を解いてみよう
 
Yesod(at FPM2012)
Yesod(at FPM2012)Yesod(at FPM2012)
Yesod(at FPM2012)
 
関数型軽い紹介
関数型軽い紹介関数型軽い紹介
関数型軽い紹介
 
たのしい関数型
たのしい関数型たのしい関数型
たのしい関数型
 
代数的データ型をラムダ計算の中で表現する方法
代数的データ型をラムダ計算の中で表現する方法代数的データ型をラムダ計算の中で表現する方法
代数的データ型をラムダ計算の中で表現する方法
 
C#erがF#に這い寄ってみた
C#erがF#に這い寄ってみたC#erがF#に這い寄ってみた
C#erがF#に這い寄ってみた
 
関数型言語初心者の俺がF#触ってみた
関数型言語初心者の俺がF#触ってみた関数型言語初心者の俺がF#触ってみた
関数型言語初心者の俺がF#触ってみた
 
F#で学ぶ関数プログラミング入門?
F#で学ぶ関数プログラミング入門?F#で学ぶ関数プログラミング入門?
F#で学ぶ関数プログラミング入門?
 
FP習熟度レベルとFSharpxのIteratee
FP習熟度レベルとFSharpxのIterateeFP習熟度レベルとFSharpxのIteratee
FP習熟度レベルとFSharpxのIteratee
 
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
 
恊働ロボットCOROの開発における形式的仕様の適用事例
恊働ロボットCOROの開発における形式的仕様の適用事例恊働ロボットCOROの開発における形式的仕様の適用事例
恊働ロボットCOROの開発における形式的仕様の適用事例
 
Katagaitai CTF勉強会 #4 Crypto
Katagaitai CTF勉強会 #4 CryptoKatagaitai CTF勉強会 #4 Crypto
Katagaitai CTF勉強会 #4 Crypto
 
JSer Class #1
JSer Class #1JSer Class #1
JSer Class #1
 

More from Naoki Kitora (7)

関数プログラミングことはじめ in 福岡
関数プログラミングことはじめ in 福岡関数プログラミングことはじめ in 福岡
関数プログラミングことはじめ in 福岡
 
関数プログラミングことはじめ revival
関数プログラミングことはじめ revival関数プログラミングことはじめ revival
関数プログラミングことはじめ revival
 
Scala kansai summit-2016
Scala kansai summit-2016Scala kansai summit-2016
Scala kansai summit-2016
 
Developers summit 2016_kansai
Developers summit 2016_kansaiDevelopers summit 2016_kansai
Developers summit 2016_kansai
 
関数プログラミングことはじめ
関数プログラミングことはじめ関数プログラミングことはじめ
関数プログラミングことはじめ
 
命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ命令プログラミングから関数プログラミングへ
命令プログラミングから関数プログラミングへ
 
第2回関数型言語勉強会 大阪
第2回関数型言語勉強会 大阪第2回関数型言語勉強会 大阪
第2回関数型言語勉強会 大阪
 

Recently uploaded

Recently uploaded (11)

NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
NewSQLの可用性構成パターン(OCHaCafe Season 8 #4 発表資料)
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版:キンドリルジャパン社内勉強会:2024年4月発表)
 
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
論文紹介: The Surprising Effectiveness of PPO in Cooperative Multi-Agent Games
 
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その22024/04/26の勉強会で発表されたものです。
 
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
Observabilityは従来型の監視と何が違うのか(キンドリルジャパン社内勉強会:2022年10月27日発表)
 
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアルLoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
LoRaWAN スマート距離検出デバイスDS20L日本語マニュアル
 
新人研修 後半 2024/04/26の勉強会で発表されたものです。
新人研修 後半        2024/04/26の勉強会で発表されたものです。新人研修 後半        2024/04/26の勉強会で発表されたものです。
新人研修 後半 2024/04/26の勉強会で発表されたものです。
 
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
LoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイスLoRaWANスマート距離検出センサー  DS20L  カタログ  LiDARデバイス
LoRaWANスマート距離検出センサー DS20L カタログ LiDARデバイス
 
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
論文紹介:Video-GroundingDINO: Towards Open-Vocabulary Spatio-Temporal Video Groun...
 
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
Amazon SES を勉強してみる その32024/04/26の勉強会で発表されたものです。
 
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
論文紹介:Selective Structured State-Spaces for Long-Form Video Understanding
 

第一回関数型言語勉強会 大阪