Recommended Javascriptで学ぶ Functional Programming
Functional Programming in Swift
TypeScript & 関数型講座 第3回 関数型入門
Scalaで萌える関数型プログラミング[1.1.RC1]
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
関数型都市忘年会『はじめての函数型プログラミング』
1+1=2の話(coinsのOCのLTで話したやつ)
20120422i phonedeveloperworkshoppublished
Introduction to lambda calculation
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
命令プログラミングから関数プログラミングへ
Japanese Slang Lesson at ConFusion
More Related Content Javascriptで学ぶ Functional Programming
Functional Programming in Swift
TypeScript & 関数型講座 第3回 関数型入門
Scalaで萌える関数型プログラミング[1.1.RC1]
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
関数型都市忘年会『はじめての函数型プログラミング』
What's hot (20)
1+1=2の話(coinsのOCのLTで話したやつ)
20120422i phonedeveloperworkshoppublished
Introduction to lambda calculation
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
命令プログラミングから関数プログラミングへ
Viewers also liked (9) Japanese Slang Lesson at ConFusion
i-Cart miniを対象としたつくばチャレンジ用ソフトウェアパッケージの開発
Dockerは2016年の秋現在どのような状況なのか~忙しい人の5分で分かるDocker~
DDoS vs. Dockerコンテナホスティング Arukas(Container SIG Meet-up 2016 Fall)
Similar to Haskell (20)
数学プログラムを Haskell で書くべき 6 の理由
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
すごいHaskell楽しく学ぼう-第12章モノイド-
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
Haskell2. Haskellについて Haskellは 純粋関数型言語 の中では 最先端かつメインストリームの言語である. λ 計算 の子孫であり , 参照透明性 を持つ. その他にも遅延評価 , 型推論 , Curry化, 型クラス等多くの機能を持つ. 参照透明ではあるが,副作用をIOモナドで行える. 3. 簡単な紹介 GHC という Haskell処理系を使う ## コンパイル # ghc a.hs # --makeってやると依存関係が楽 ## バッチ実行 # runhaskell a.hs # runghcでも可 ## 対話実行 # ghci 4. 簡単な紹介 x = 3* 5 ^2 +13 -- 普通に計算 88 add = \x y -> x + y -- 匿名関数 -- Mirandaやその祖先よりパターンマッチを導入 mysum [] = 0 mysum (x:xs) = x+ mysum xs -- 再帰的定義 5. 簡単な紹介 -- 同様にGuardを導入 abs x | x >= 0 = x | otherwise = negate x -- 高階関数 遅延リスト evens = filter even [0..] -- [0,2,4,6...] evens10 = take 3 evens -- [0,2,4] 6. 簡単な紹介 -- curry化.showは1引数を取り文字列にする str123 = concat (map show [1,2,3]) -- 2項演算子も curry化される myproduct list = foldl (*) 1 list evens = [ x | x <- [0..] , even x] -- 内包表現 7. 簡単な紹介 -- 構造体 data Rgb = Red | Green | Blue blue = Blue data Pair a = Null | Atom a | Cons (Pair a) (Pair a) pari1 = Cons (Atom 1) Null 8. 簡単な紹介 -- 多相(多態) instance (Show a)=>Show (Pair a) where show Null = “Null” show (Atom a)= “Atom ” ++show a show (Cons a b) =“(”++show a ++ “,”++ show b++ “)” 16. 数学的関数とは 等号 で結ばれた式の 変換が可能 . 群を例に! 以下 a,b,c,e,g は集合 G の要素 . * は 2 項演算子で以下を満たす . 結合法則 a*(b*c)=(a*b)*c を満たす . 17. 単位元 G の全ての要素 g に g*e=g となる e がある .(x*1=x) 20. λ計算 λ 計算とは 匿名関数のみで計算する概念 . ループは Y-combinator で定義でき , If 文は遅延関数のみで実現可能であり チューリング完全である . 22. 型推論 Haskellでは 静的な型を 持つが, 関連する情報から型を推論し 多くの部分では省略できる . また,静的型よりコンパイル時に型エラーを発見でき, 実行速度は高速である. 関数は関数を引数に取れて複雑な型となるが. Haskellではそれも推論可能である. 23. 参照透明性(1) 関数の引数が決まれば戻り値が決まる特性 . (「数学的関数とは」と同じ事である) プログラムの構造を規則 ( 等号 ) によって変換できる . ( 例 ) : map (+1) (map (*2) x) = map (\a->2*a+1) x プログラムの変換で 極限まで無駄を省くと , 必要になるまで評価しない 遅延評価になる . 基本的にデータ構造も遅延的な特性を持つ . 25. Curry化 2以上の引数を持つ関数を 1引数の関数を階層化した形で表現すること. func x y = value => \y -> (\x -> value) 0引数の関数は定数と同じで,あとは1引数の関数しかないので言語は簡略化し,部分適用も簡単に行える.プログラムの変換が可能だから効率は悪くない. (+1) = (\ y -> (\x -> x + y)) 1 = (\y -> y + 1) 26. 型クラス(1) 以下サンプルコード infix 4 ==, /= -- infix は 2 項演算子の定義 . 4 の部分は高い程優先される -- * は 6 で (+) は 5 なので 2*3+1 == 7 は True になる -- True == True == True はエラー , infixr とか infixl なら ok data Int = MakeInt IntInC -- C で書かれた Int 型 27. 型クラス(2) class Eq a where (==), (/=) :: a -> a -> Bool x /= y = not (x == y) x == y = not (x /= y) -- javaのinterfaceに近いが厳密な型ではない. instance Eq Int where (==) = inteq 28. 型クラス(3) -- java の interface より (Eq a) という依存関係の定義が勝る class (Eq a) => Ord a where compare :: a -> a -> Ordering (<), (<=), (>), (>=) :: a -> a -> Bool max, min :: a -> a -> a … 35. IOモナド(1) >>=, >>, return, fail を含む Monad 型クラスで Global 環境を持ち運びながら計算を行う . Global 環境は毎回変化し違う値のはずなので , 参照透明であっても IO 関数に対する プログラムの変換 (Graph 簡約等 ) が行われない . >> や >>= によって IO 関数の計算の順番も決定する . 37. おまけ 関数合成 f.g = \x -> f (g x) -- 定義 -- 例 map (*2) . map (+1) \y -> map (*2) (map (+1) y) -- 2引数関数でも可能 (all . any) even [[1,2],[3,4]] -- True (all . any) = \f -> \x -> all (\y -> any f y) x 38. おまけ Parser Combinator Parser(構文解析器)を関数の合成で表現する. parse (try (string "(a)") <|> string "(b)") "" "(b)" パーザは型さえ合えば何段もネスト可能であり, 匿名関数を使用した機能もある等 柔軟かつ高機能である. 速度も比較的速い(最近もっと速いやつもあるらしい) Editor's Notes #5: 対話環境では let で副作用のない変数を作れる . #10: λ 計算はチューリングマシンより前の話 1936 年の手続き的なチューリングマシンも数学者チューリングの生み出した数学的概念である . それは , 無限に長いテープとその中に格納された情報を読み書きするヘッドと機械の内部状態を記憶するメモリを持つ . また , ヘッドの位置をテープに書き込むこと機械の内部状態を変えることヘッドを左右に一つ動かすことができる . ISWIM の実装はない MIRANDA の祖先はパターンマッチとかガードとかを持つ言語 #12: 単位元 x*1 = x 1*x=x => 左から x を掛ける x*1*x = x*x => 右から x の逆元を掛ける . x*1*x*x^-1=x*x*x^-1 結合法則より右側を優先して演算可能 (x*x^-1)=1 x*1*1=x*1 一番右を計算 x*1 = x できた! #13: チューリング完全は , 宣言的に可能な計算はどんな計算もできるという意味だと思う . #16: 必要になるまでの条件は最外簡約で決まる. 全てのプログラムの変換を行えるわけではないと思われる. #18: カリー化があると,コンパイルエラーの表示が分かりにくくなるという弱点もあるかも. #19: 1文字の変数を使っていいのは1行+αの場合だけ.複数行(変数)の場合はもっと長くした方が良い. Test ...x... みたいにxを間違って打つと何だか分からないことになるし誤動作の元である. #22: ooのようなclass treeを遡らない. 型推論の件は, オブジェクト指向だとClass1.getxとClass2.getxが型が同じとは限らないからか. プログラミング言語のソースコードは 簡単な問題がエレガントに解かれていて初心者の勉強に役立つ. #26: Object指向のCascadeは遅いし,若干醜いし,2項演算に難があるかもしれない. #27: 高速性が必要なければ,配列等は変更の度に新しいのに変えればよい.