SlideShare a Scribd company logo
純粋関数型言語 Haskell入門 (社内勉強会) @todorokit
Haskellについて Haskellは 純粋関数型言語 の中では 最先端かつメインストリームの言語である. λ 計算 の子孫であり , 参照透明性 を持つ. その他にも遅延評価 ,  型推論 , Curry化, 型クラス等多くの機能を持つ. 参照透明ではあるが,副作用をIOモナドで行える.
簡単な紹介 GHC という Haskell処理系を使う ## コンパイル # ghc a.hs # --makeってやると依存関係が楽 ## バッチ実行 # runhaskell a.hs # runghcでも可 ## 対話実行 #  ghci
簡単な紹介  x = 3* 5 ^2 +13  -- 普通に計算 88  add = \x y -> x + y -- 匿名関数  --  Mirandaやその祖先よりパターンマッチを導入  mysum [] = 0  mysum (x:xs) = x+ mysum xs -- 再帰的定義
簡単な紹介  -- 同様にGuardを導入  abs x | x >= 0  = x    | otherwise  = negate x   -- 高階関数 遅延リスト  evens = filter even [0..] -- [0,2,4,6...]  evens10 = take 3 evens -- [0,2,4]
簡単な紹介  -- curry化.showは1引数を取り文字列にする  str123 = concat (map show [1,2,3])  -- 2項演算子も curry化される  myproduct list = foldl (*) 1 list  evens = [ x | x <- [0..] , even x] -- 内包表現
簡単な紹介  -- 構造体  data Rgb = Red | Green | Blue blue = Blue   data Pair a = Null | Atom a | Cons (Pair a) (Pair a)  pari1  = Cons (Atom 1) Null
簡単な紹介  -- 多相(多態)  instance (Show a)=>Show (Pair a) where    show Null  = “Null” show (Atom a)= “Atom ” ++show a     show (Cons a b) =“(”++show a ++ “,”++ show b++ “)”
関数型の歴史 1930年代:λ計算はλ式による具体的・汎用的計算を行える数学的概念.
1958年:Lispがλ計算ができる最初の言語.
1966年:ISWIMという純粋関数型言語ができる.
1974年:ML言語は型推論を持つ関数型言語.
1985年:Mirandaという多機能な純粋関数型言語がHaskellの直接の祖先.
…  Wikipediaに詳しく載ってます.
純粋関数型言語 純粋関数型言語とは とは数学的な関数の評価を行い , 状態やデータの変更を行わない プログラミングパラダイムを採用した言語である . ルーツは λ 計算であり 匿名関数 を持つ .
数学的関数とは 等号 で結ばれた式の 変換が可能 . 群を例に! 以下 a,b,c,e,g  は集合 G の要素 . * は 2 項演算子で以下を満たす . 結合法則  a*(b*c)=(a*b)*c を満たす .
単位元  G の全ての要素 g に g*e=g  となる e がある .(x*1=x)
逆元  g*a=e となる a が存在する .(x*x^-1=1)
ここから掛算の 1*x = x  を導出可能である .
λ計算   λ 計算とは 匿名関数のみで計算する概念 . ループは Y-combinator で定義でき , If 文は遅延関数のみで実現可能であり チューリング完全である .
関数型言語 関数型言語ではその特性上, 頻繁に使用されるデータ構造も手続き型と違う. シーケンス的なデータ構造(配列等)にはList(LinkList)が用いられる.
型推論 Haskellでは 静的な型を 持つが, 関連する情報から型を推論し 多くの部分では省略できる . また,静的型よりコンパイル時に型エラーを発見でき, 実行速度は高速である. 関数は関数を引数に取れて複雑な型となるが. Haskellではそれも推論可能である.
参照透明性(1) 関数の引数が決まれば戻り値が決まる特性 . (「数学的関数とは」と同じ事である) プログラムの構造を規則 ( 等号 ) によって変換できる . ( 例 ) : map (+1) (map (*2) x) = map (\a->2*a+1) x プログラムの変換で 極限まで無駄を省くと , 必要になるまで評価しない 遅延評価になる . 基本的にデータ構造も遅延的な特性を持つ .
参照透明性(2) 値の変更ができないため, 他の言語に良くあるループの構造は存在しない. その代わりに再帰を使って実現する. 再帰であってもループと等価であれば, コンパイラがループに変換可能である. let var1 = 1 in let var1 = 2 in var1*2 -- => 4 のように同名の新しい変数を定義すれば, 通常の代入でやりたいことができる場合も多い.
Curry化 2以上の引数を持つ関数を 1引数の関数を階層化した形で表現すること. func x y = value => \y -> (\x -> value) 0引数の関数は定数と同じで,あとは1引数の関数しかないので言語は簡略化し,部分適用も簡単に行える.プログラムの変換が可能だから効率は悪くない. (+1) = (\ y -> (\x -> x + y)) 1 = (\y -> y + 1)
型クラス(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 型

More Related Content

ODP
Javascriptで学ぶ Functional Programming
PDF
Functional Programming in Swift
PPTX
Java8から始める関数型プログラミング
PDF
TypeScript & 関数型講座 第3回 関数型入門
PDF
Scalaで萌える関数型プログラミング[1.1.RC1]
PDF
たのしい関数型
PDF
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
PDF
関数型都市忘年会『はじめての函数型プログラミング』
Javascriptで学ぶ Functional Programming
Functional Programming in Swift
Java8から始める関数型プログラミング
TypeScript & 関数型講座 第3回 関数型入門
Scalaで萌える関数型プログラミング[1.1.RC1]
たのしい関数型
「再代入なんて、あるわけない」 ~ふつうのプログラマが関数型言語を知るべき理由~ (Gunma.web #5 2011/05/14)
関数型都市忘年会『はじめての函数型プログラミング』

What's hot (20)

PDF
磯野ー!関数型言語やろうぜー!
PDF
関数型プログラミング in javascript
PDF
Material
PDF
Java8 lambdas chapter1_2
PPTX
RubyとJavaScriptに見る第一級関数
PDF
[Basic 12] 関数型言語 / 型理論
PPTX
1+1=2の話(coinsのOCのLTで話したやつ)
PDF
20120422i phonedeveloperworkshoppublished
PPT
アルゴリズムとデータ構造2
PPTX
Introduction to lambda calculation
PPTX
1+1=2の話
PPTX
第3章 型とクラス
PPTX
第3章 型とクラス
PPTX
ゆるふわScalaコップ本読書会 第7章
PPT
言語処理系入門4
PPT
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
PDF
第2回関数型言語勉強会 大阪
PPT
オブジェクト指向入門5
PDF
命令プログラミングから関数プログラミングへ
PPT
篠崎Lt20141215
磯野ー!関数型言語やろうぜー!
関数型プログラミング in javascript
Material
Java8 lambdas chapter1_2
RubyとJavaScriptに見る第一級関数
[Basic 12] 関数型言語 / 型理論
1+1=2の話(coinsのOCのLTで話したやつ)
20120422i phonedeveloperworkshoppublished
アルゴリズムとデータ構造2
Introduction to lambda calculation
1+1=2の話
第3章 型とクラス
第3章 型とクラス
ゆるふわScalaコップ本読書会 第7章
言語処理系入門4
ジェネリクスの基礎と応用 JJUG CCC 2012 Fall
第2回関数型言語勉強会 大阪
オブジェクト指向入門5
命令プログラミングから関数プログラミングへ
篠崎Lt20141215
Ad

Viewers also liked (9)

PPT
Japanese Slang Lesson at ConFusion
PDF
AWS SDK for Haskell開発
ODP
Hacking Robotics
PDF
i-Cart miniを対象としたつくばチャレンジ用ソフトウェアパッケージの開発
PDF
DockerでGUIアプリケーションを動かす
PDF
JenkinsとjMeterで負荷テストの自動化
PDF
Dockerは2016年の秋現在どのような状況なのか~忙しい人の5分で分かるDocker~
PDF
すごいHaskellたのしくHeroku!
PDF
DDoS vs. Dockerコンテナホスティング Arukas(Container SIG Meet-up 2016 Fall)
Japanese Slang Lesson at ConFusion
AWS SDK for Haskell開発
Hacking Robotics
i-Cart miniを対象としたつくばチャレンジ用ソフトウェアパッケージの開発
DockerでGUIアプリケーションを動かす
JenkinsとjMeterで負荷テストの自動化
Dockerは2016年の秋現在どのような状況なのか~忙しい人の5分で分かるDocker~
すごいHaskellたのしくHeroku!
DDoS vs. Dockerコンテナホスティング Arukas(Container SIG Meet-up 2016 Fall)
Ad

Similar to Haskell (20)

PDF
Haskell Lecture 1
PDF
Haskell超入門 Part.1
PDF
数学プログラムを Haskell で書くべき 6 の理由
PDF
初めてのHaskell (表)
PDF
プログラミングHaskell(第1章)
PDF
すごいHaskell読書会#1 in 大阪
ODP
Vim scriptとJavaとHaskell
KEY
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
PDF
Haskell勉強会 in ie
PDF
すごいHaskell読書会
PDF
関数プログラミング入門
PPT
Clean
PPT
Clean
PDF
ScalaプログラマのためのHaskell入門
PDF
関数プログラミング入門
PDF
すごいHaskell楽しく学ぼう-第12章モノイド-
PDF
Haskell勉強会2 in ie
PDF
プログラミングHaskell(第2章)
PDF
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
PDF
Scalaプログラミング・マニアックス
Haskell Lecture 1
Haskell超入門 Part.1
数学プログラムを Haskell で書くべき 6 の理由
初めてのHaskell (表)
プログラミングHaskell(第1章)
すごいHaskell読書会#1 in 大阪
Vim scriptとJavaとHaskell
How wonderful to be (statically) typed 〜型が付くってスバラシイ〜
Haskell勉強会 in ie
すごいHaskell読書会
関数プログラミング入門
Clean
Clean
ScalaプログラマのためのHaskell入門
関数プログラミング入門
すごいHaskell楽しく学ぼう-第12章モノイド-
Haskell勉強会2 in ie
プログラミングHaskell(第2章)
関数型言語テイスティング: Haskell, Scala, Clojure, Elixirを比べて味わう関数型プログラミングの旨さ
Scalaプログラミング・マニアックス

Haskell

Editor's Notes

  • #5: 対話環境では let で副作用のない変数を作れる .
  • #10: λ 計算はチューリングマシンより前の話 1936 年の手続き的なチューリングマシンも数学者チューリングの生み出した数学的概念である . それは , 無限に長いテープとその中に格納された情報を読み書きするヘッドと機械の内部状態を記憶するメモリを持つ . また , ヘッドの位置をテープに書き込むこと機械の内部状態を変えることヘッドを左右に一つ動かすことができる . ISWIM の実装はない MIRANDA の祖先はパターンマッチとかガードとかを持つ言語
  • #12: 単位元 x*1 = x 1*x=x =&gt; 左から x を掛ける x*1*x = x*x =&gt; 右から 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: 高速性が必要なければ,配列等は変更の度に新しいのに変えればよい.