SlideShare a Scribd company logo
1 of 39
Download to read offline
F# による関数プログラミング入門
中山裕貴
Aiming 大阪スタジオ エンジニア勉強会
2013 年 5 月 27 日
Functional Programming?
Functional Programming?
Functional の意味はどれでしょう?
Functional Programming?
Functional の意味はどれでしょう?
• 機能
Functional Programming?
Functional の意味はどれでしょう?
• 機能
• (数学の)関数
Functional Programming?
Functional の意味はどれでしょう?
• 機能
• (数学の)関数
• 実用
Functional Programming?
Functional の意味はどれでしょう?
• 機能
• (数学の)関数
• 実用
関数プログラミングという手法
“関数をデータに適用する” 手法
関数をデータに適用すると…
関数をデータに適用すると…
• 小さな関数を組み合わせることによる抽象度
の向上
関数をデータに適用すると…
• 小さな関数を組み合わせることによる抽象度
の向上
• バグも入り込みにくい小さな関数をつなげて
大きな関数を作る
関数をデータに適用するために必要なもの
関数をデータに適用するために必要なもの
• 小さな関数を組み合わせる
− > 関数が第一級であるほうが便利
関数をデータに適用するために必要なもの
• 小さな関数を組み合わせる
− > 関数が第一級であるほうが便利
• 名前をつけたくない関数の存在
− > ラムダ式
関数をデータに適用するために必要なもの
• 小さな関数を組み合わせる
− > 関数が第一級であるほうが便利
• 名前をつけたくない関数の存在
− > ラムダ式
• 同じデータであれば同じ結果であってほしい
− > 破壊的代入を持たない
− > 関数や型の再帰的定義を利用
言葉に関する注意点
山本和彦さんの “関数プログラミングの道しるべ” より抜粋(資料リ
ンク)
関数型言語とは…
関数プログラミングの手法を提供、推奨している
言語
と考えるのがわかりやすい
F# による関数プログラミング紹介
F#
• Microsoft Research が開発
• FP と OOP によるマルチパラダイム
• 静的型付け、.NET 基盤
• コンパイラのソースコードが公開されている
ん?
ん?
.NET といえば C# . . .
ん?
.NET といえば C# . . .
• C# には LINQ あるよね?
ん?
.NET といえば C# . . .
• C# には LINQ あるよね?
• ラムダ式も導入されているし…
ん?
.NET といえば C# . . .
• C# には LINQ あるよね?
• ラムダ式も導入されているし…
• 別に F# でなくても良くない?
そういうわけでもない
そういうわけでもない
C# では
そういうわけでもない
C# では
• 関数が第一級オブジェクトではない
そういうわけでもない
C# では
• 関数が第一級オブジェクトではない
• ラムダ式を使える範囲も限定的
そういうわけでもない
C# では
• 関数が第一級オブジェクトではない
• ラムダ式を使える範囲も限定的
• 破壊的代入を許可している
そういうわけでもない
C# では
• 関数が第一級オブジェクトではない
• ラムダ式を使える範囲も限定的
• 破壊的代入を許可している
• 型を手軽に定義やすいわけではない、etc
− > 本日のスコープ外
というわけで
というわけで
• メインパラダイムの違いは差が大きい
というわけで
• メインパラダイムの違いは差が大きい
• より良い C# コードを書く勉強の一環として、
少し触ってみましょう
まず型定義 
type EquipmentType =
| Weapon
| Protector
type Rarity =
| Common
| UnCommon
| Rare
| SuperRare
| UltraRare
type Equipment = {
name : string
ability : decimal
rarity : Rarity
equipmentType : EquipmentType }
補正付き合計攻撃力の算出 
(* decimal - Equipment list - decimal *)
let totalCorrectionOffensiveAbility correctionValue equipments =
equipments
| List.filter (fun e - e.equipmentType = Weapon)
| List.fold (fun acc e - acc + e.ability) 0m
| if correctionValue  0m then (*) (1m + correctionValue) else id
(* Equipment list - unit *)
let printCorrectionOffensiveAbility equipments =
equipments
| totalCorrectionOffensiveAbility 0.33m
| printfn 補正付き合計攻撃力:%M
簡易ゲームループ 
let rec gameLoop update fps = async {
do update ()
do! Async.Sleep (1000 / fps)
return! gameLoop update fps }
関数型言語いろいろ
有名どころ
• Haskell −  いわゆる純粋関数型
• OCaml −  ML ベース
• Scala −  JVM, マルチパラダイム
• Erlang −  どちらかといえば分散指向
• Clojure −  JVM,LISP 方言
まとめ
• 関数プログラミング
• F# での関数プログラミング
• 話さなかったこと 1:静的型付け関数型
• 話さなかったこと 2:コンビネータ

More Related Content

Viewers also liked

Erlangを触ってみた
Erlangを触ってみたErlangを触ってみた
Erlangを触ってみた
Yoichi Toyota
 
第一回関数型言語勉強会 大阪
第一回関数型言語勉強会 大阪第一回関数型言語勉強会 大阪
第一回関数型言語勉強会 大阪
Naoki Kitora
 
関数型言語初心者の俺がF#触ってみた
関数型言語初心者の俺がF#触ってみた関数型言語初心者の俺がF#触ってみた
関数型言語初心者の俺がF#触ってみた
Takashi Nishisaki
 
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
 
F#のコンピュテーション式
F#のコンピュテーション式F#のコンピュテーション式
F#のコンピュテーション式
pocketberserker
 

Viewers also liked (20)

Erlang
ErlangErlang
Erlang
 
Erlangを触ってみた
Erlangを触ってみたErlangを触ってみた
Erlangを触ってみた
 
GHC 6.12.1 マルチコア対応ランタイムシステムについて
GHC 6.12.1 マルチコア対応ランタイムシステムについてGHC 6.12.1 マルチコア対応ランタイムシステムについて
GHC 6.12.1 マルチコア対応ランタイムシステムについて
 
Yesod(at FPM2012)
Yesod(at FPM2012)Yesod(at FPM2012)
Yesod(at FPM2012)
 
関数型軽い紹介
関数型軽い紹介関数型軽い紹介
関数型軽い紹介
 
第一回関数型言語勉強会 大阪
第一回関数型言語勉強会 大阪第一回関数型言語勉強会 大阪
第一回関数型言語勉強会 大阪
 
関数型言語初心者の俺がF#触ってみた
関数型言語初心者の俺がF#触ってみた関数型言語初心者の俺がF#触ってみた
関数型言語初心者の俺がF#触ってみた
 
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
Pythonista による Pythonista のための Scala 紹介 in BPStudy #49
 
Katagaitai CTF勉強会 #4 Crypto
Katagaitai CTF勉強会 #4 CryptoKatagaitai CTF勉強会 #4 Crypto
Katagaitai CTF勉強会 #4 Crypto
 
これから Haskell を書くにあたって
これから Haskell を書くにあたってこれから Haskell を書くにあたって
これから Haskell を書くにあたって
 
JSer Class #1
JSer Class #1JSer Class #1
JSer Class #1
 
F#のコンピュテーション式
F#のコンピュテーション式F#のコンピュテーション式
F#のコンピュテーション式
 
120901fp key
120901fp key120901fp key
120901fp key
 
純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門純粋関数型アルゴリズム入門
純粋関数型アルゴリズム入門
 
関数型言語とオブジェクト指向言語(序章)
関数型言語とオブジェクト指向言語(序章)関数型言語とオブジェクト指向言語(序章)
関数型言語とオブジェクト指向言語(序章)
 
データベース入門3
データベース入門3データベース入門3
データベース入門3
 
TDDBC東京 1.6 LT
TDDBC東京 1.6 LTTDDBC東京 1.6 LT
TDDBC東京 1.6 LT
 
関数プログラミング入門
関数プログラミング入門関数プログラミング入門
関数プログラミング入門
 
磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!磯野ー!関数型言語やろうぜー!
磯野ー!関数型言語やろうぜー!
 
Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門Scalaで学ぶ関数型言語超入門
Scalaで学ぶ関数型言語超入門
 

Similar to F#で学ぶ関数プログラミング入門?

オブジェクト指向最強
オブジェクト指向最強オブジェクト指向最強
オブジェクト指向最強
haganemetal
 
Functional Programming in Swift
Functional Programming in SwiftFunctional Programming in Swift
Functional Programming in Swift
Kaz Yoshikawa
 
Creating Mashup service in Yamaguchi
Creating Mashup service in YamaguchiCreating Mashup service in Yamaguchi
Creating Mashup service in Yamaguchi
Ohishi Mikage
 

Similar to F#で学ぶ関数プログラミング入門? (20)

Swiftで説明する「モナド」:Swiftにおける関数型プログラミングの使い方
Swiftで説明する「モナド」:Swiftにおける関数型プログラミングの使い方Swiftで説明する「モナド」:Swiftにおける関数型プログラミングの使い方
Swiftで説明する「モナド」:Swiftにおける関数型プログラミングの使い方
 
楽天エンジニアライフ
楽天エンジニアライフ楽天エンジニアライフ
楽天エンジニアライフ
 
OpenSpan_PreMarketing
OpenSpan_PreMarketingOpenSpan_PreMarketing
OpenSpan_PreMarketing
 
Javascriptで学ぶ Functional Programming
Javascriptで学ぶ Functional ProgrammingJavascriptで学ぶ Functional Programming
Javascriptで学ぶ Functional Programming
 
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
最新C#動向と関数型言語haskell ~命令型静的プログラミングから関数型動的プログラミングへのシフト~
 
本の紹介
本の紹介本の紹介
本の紹介
 
我が家のフロントエンド開発事情
我が家のフロントエンド開発事情我が家のフロントエンド開発事情
我が家のフロントエンド開発事情
 
20150131 mvp com_camp_lt
20150131 mvp com_camp_lt20150131 mvp com_camp_lt
20150131 mvp com_camp_lt
 
LogicFlow 実践編~LogicFlowでいろいろつくってみた ~
LogicFlow 実践編~LogicFlowでいろいろつくってみた ~LogicFlow 実践編~LogicFlowでいろいろつくってみた ~
LogicFlow 実践編~LogicFlowでいろいろつくってみた ~
 
オブジェクト指向最強
オブジェクト指向最強オブジェクト指向最強
オブジェクト指向最強
 
2014年の社内新人教育テキスト #1(プログラミング言語概論)
2014年の社内新人教育テキスト #1(プログラミング言語概論)2014年の社内新人教育テキスト #1(プログラミング言語概論)
2014年の社内新人教育テキスト #1(プログラミング言語概論)
 
プログラミングとは
プログラミングとはプログラミングとは
プログラミングとは
 
新しいソフトウェアエンジニアリングのためのパターンランゲージに向けて
新しいソフトウェアエンジニアリングのためのパターンランゲージに向けて新しいソフトウェアエンジニアリングのためのパターンランゲージに向けて
新しいソフトウェアエンジニアリングのためのパターンランゲージに向けて
 
Functional Programming in Swift
Functional Programming in SwiftFunctional Programming in Swift
Functional Programming in Swift
 
テクノアカデミー郡山 現役ソフトウェアエンジニアが語る。IT の今と未来
テクノアカデミー郡山 現役ソフトウェアエンジニアが語る。IT の今と未来テクノアカデミー郡山 現役ソフトウェアエンジニアが語る。IT の今と未来
テクノアカデミー郡山 現役ソフトウェアエンジニアが語る。IT の今と未来
 
Creating Mashup service in Yamaguchi
Creating Mashup service in YamaguchiCreating Mashup service in Yamaguchi
Creating Mashup service in Yamaguchi
 
転移学習ランキング・ドメイン適応
転移学習ランキング・ドメイン適応転移学習ランキング・ドメイン適応
転移学習ランキング・ドメイン適応
 
はじめての「R」
はじめての「R」はじめての「R」
はじめての「R」
 
モバイルアプリパフォーマンス向上の道を踏み出す前に知っておきたいコト!@andousan
モバイルアプリパフォーマンス向上の道を踏み出す前に知っておきたいコト!@andousanモバイルアプリパフォーマンス向上の道を踏み出す前に知っておきたいコト!@andousan
モバイルアプリパフォーマンス向上の道を踏み出す前に知っておきたいコト!@andousan
 
データ視覚化・分析アプリケーションの超速開発
データ視覚化・分析アプリケーションの超速開発データ視覚化・分析アプリケーションの超速開発
データ視覚化・分析アプリケーションの超速開発
 

F#で学ぶ関数プログラミング入門?