SlideShare uma empresa Scribd logo
1 de 13
Baixar para ler offline
Haskellハンズオン
●
資料: オーム社『プログラミングHaskell』
記号表
Haskellについて
● Haskell自体には特にCSPとのかかわりはない
●
並列・並行フレームワークは近年さかんに開発
されている / DSLのツールとしても有用
● Software Transactional Memory (STM) が有力
● 標準でIOなどの副作用が閉込められているため
● Communicating Haskell Processes (CHP)
● CSPベースの並行フレームワーク
● 『Haskellによる並列・並行プログラミング』
● モナド: 言語(コア)マターではなくライブラリ
(構文糖などはあるが)
遅延評価
Prelude> let lst = [x*x | x <- [1..10]] :: [Int]
Prelude> :sp lst
lst = _
Prelude> take 3 lst
[1,4,9]
Prelude> :sp lst
lst = 1 : 4 : 9 : _
Prelude> length lst
10
Prelude> :sp lst
lst = [1,4,9,_,_,_,_,_,_,_]
「魔法ではない」
● Haskell自体には、Prologのようなパターンマッ
チ&バックトラックはありません
● パターンマッチは関数適用の1方向のみ
               ⬐できません
● predicate x x のようにして「2個の実引数が同じ」
●
(たとえば)整数引数の関数が
自動でメモ化されるわけでもありません
● 例: ナイーブな fib はやはりとても遅い
●
それなりに効率的なコードは
それなりに難しい → 最後に
第2章
● https://www.haskell.org/hoogle/
● p. 15 : ghci では let one = 1 のように、
1行なら定義ができる
● p. 16 : コロンで始まるコマンドは、
そこにあるものは ghci でも共通
●
名前(識別子)は種類ごとに
●
先頭が小文字の名前
●
先頭が大文字の名前
●
(先頭がコロン以外の演算子)
●
(先頭がコロンの演算子)
第2章 (cont)
● 優先順位: 関数適用は高く、演算子は低い
● $ 演算子は優先順位最低の右結合演算子
● a b (c d) → a b $ c d
● ' は先頭にあると Char のリテラル、それ以外は
名前の一部として使える
(「ちょっとした違い」の意味で多用)
● -- から行末まではコメント
第3章
● 「:t」コマンドで型の情報を表示
● 「:i」コマンドでその名前に関する情報
●
ごちゃごちゃ出てくるのですぐには慣れないかも
● 型推論: 簡単な式なら任せっきりで良い
● -Wall を付けていると、トップレベルの定義に
「 :: 型」が無い場合は警告
● 最初からある (Prelude の) 名前を変えるのは、
my--- とか付けて避けてください
● Fractional と Data.Ratio.% , toRational
第4章
● Pythonは「TOOWTDI」だが、Haskellはそうで
はない(必ずしもTMTOWTDIでもないが)
●
多値関数はタプルとタプルパターンで
● n+kパターンはobsoleted
●
(既に出ているが)「セクション」の反対は
バッククオート
(例) 10 `div` 3
● (慣れてきたら) declaration styleで
● https://wiki.haskell.org/Declaration_vs._expression_style
第5章
● リスト内包表記 (list comprehension、包含)
● 「 <- 」(本文中では ← ) は、集合の
記法の ∈ の気分、「外延と内包」の内包
● (最近のPythonにも似たものがある)
●
やはり魔法ではない
● [(x,y) | x <- [0..], y <- [0,1,2]] --これはOK
● [(x,y) | x <- [0,1,2], y <- [0..]] -- これはダメ
(これはMirandaでは // という記号を使う
diagonalisingというものでできる)
第6章、第7章
●
再帰と高階関数
● 『Lisp(Scheme)手習い』
●
最初は再帰で、慣れたら高階関数へ
●
効率?
●
そのうちどうしても実際に問題が出たら
● 遅延評価のせいで 1+2+3+...+10000 を計算しないま
ま持つようになっているかもしれない
●
だけどそれを逆にしようとした結果、必要のない計
算までするようにしてしまうかもしれない
続き
●
効率? (続き)
●
これまでのプログラミングの直感と違う
●
ほんとに大変なら、詳しい人に助言を仰ぐ
● 以前は foldl は要注意でしたが、最近は大丈夫
● http://www.well-typed.com/blog/2014/04/fixing-foldl/
●
というわけで、だいたい大丈夫ではある
●
でも、ビッグデータもどきぐらいでも問題出るかも
● オライリー『Real World Haskell』第25章
● この資料の次のページ (のリンク先) も参照
その他のまとめ
● Haskellらしい、かつちゃんとチューニングされた
●
フィボナッチ
●
素数
● クイック(等)ソート
●
http://d.hatena.ne.jp/kazu-yamamoto/20100624/1277348961を
参照
●
参:手続き言語で同様にチューニングされたQソート
●
岩波講座 ソフトウェア科学 3
『アルゴリズムとデータ構造』
●
マージソート?
● http://ksmakoto.hatenadiary.com/entry/2014/05/23/195724

Mais conteúdo relacionado

Semelhante a 20151121

現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについてNobukazu Hanada
 
GHC 6.12.1 マルチコア対応ランタイムシステムについて
GHC 6.12.1 マルチコア対応ランタイムシステムについてGHC 6.12.1 マルチコア対応ランタイムシステムについて
GHC 6.12.1 マルチコア対応ランタイムシステムについてMitsutoshi Aoe
 
Powershell基礎_20180521用
Powershell基礎_20180521用Powershell基礎_20180521用
Powershell基礎_20180521用Tetsu Yama
 
Object-Funcational Analysis and design
Object-Funcational Analysis and designObject-Funcational Analysis and design
Object-Funcational Analysis and designTomoharu ASAMI
 
ScalaプログラマのためのHaskell入門
ScalaプログラマのためのHaskell入門ScalaプログラマのためのHaskell入門
ScalaプログラマのためのHaskell入門Yasuaki Takebe
 
Scala Daysに行ってみて
Scala Daysに行ってみてScala Daysに行ってみて
Scala Daysに行ってみてKota Mizushima
 
RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成弘毅 露崎
 
Cloudera Impala Seminar Jan. 8 2013
Cloudera Impala Seminar Jan. 8 2013Cloudera Impala Seminar Jan. 8 2013
Cloudera Impala Seminar Jan. 8 2013Cloudera Japan
 
PHP基礎勉強会
PHP基礎勉強会PHP基礎勉強会
PHP基礎勉強会Yuji Otani
 
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったかm2ym
 
言語アップデート -Scala編-
言語アップデート -Scala編-言語アップデート -Scala編-
言語アップデート -Scala編-Kota Mizushima
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説do_aki
 
Rawlerフレームワーク(全体)
Rawlerフレームワーク(全体)Rawlerフレームワーク(全体)
Rawlerフレームワーク(全体)Takaichi Ito
 
並行プログラミング with Haskell
並行プログラミング with Haskell並行プログラミング with Haskell
並行プログラミング with Haskellcoil_kpc
 
Sass/Compass講習会
Sass/Compass講習会Sass/Compass講習会
Sass/Compass講習会Beeworks
 
SpringOne 2016 報告 Reactive APIの設計・実装・使用
SpringOne 2016 報告 Reactive APIの設計・実装・使用SpringOne 2016 報告 Reactive APIの設計・実装・使用
SpringOne 2016 報告 Reactive APIの設計・実装・使用Takuya Iwatsuka
 

Semelhante a 20151121 (20)

現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
現在のWebフロントエンドの現状と愚痴と、それに対するHaxeフロントエンドライブラリMageについて
 
Startup JavaScript
Startup JavaScriptStartup JavaScript
Startup JavaScript
 
GHC 6.12.1 マルチコア対応ランタイムシステムについて
GHC 6.12.1 マルチコア対応ランタイムシステムについてGHC 6.12.1 マルチコア対応ランタイムシステムについて
GHC 6.12.1 マルチコア対応ランタイムシステムについて
 
CHP survey
CHP surveyCHP survey
CHP survey
 
Powershell基礎_20180521用
Powershell基礎_20180521用Powershell基礎_20180521用
Powershell基礎_20180521用
 
Object-Funcational Analysis and design
Object-Funcational Analysis and designObject-Funcational Analysis and design
Object-Funcational Analysis and design
 
ScalaプログラマのためのHaskell入門
ScalaプログラマのためのHaskell入門ScalaプログラマのためのHaskell入門
ScalaプログラマのためのHaskell入門
 
Scala Daysに行ってみて
Scala Daysに行ってみてScala Daysに行ってみて
Scala Daysに行ってみて
 
RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成RとSQLiteで気軽にデータベース作成
RとSQLiteで気軽にデータベース作成
 
Cloudera Impala Seminar Jan. 8 2013
Cloudera Impala Seminar Jan. 8 2013Cloudera Impala Seminar Jan. 8 2013
Cloudera Impala Seminar Jan. 8 2013
 
PHP基礎勉強会
PHP基礎勉強会PHP基礎勉強会
PHP基礎勉強会
 
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
括弧への異常な愛情 または私は如何にして心配するのを止めてCommon Lispを愛するようになったか
 
clominal
clominalclominal
clominal
 
言語アップデート -Scala編-
言語アップデート -Scala編-言語アップデート -Scala編-
言語アップデート -Scala編-
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 
Rawlerフレームワーク(全体)
Rawlerフレームワーク(全体)Rawlerフレームワーク(全体)
Rawlerフレームワーク(全体)
 
並行プログラミング with Haskell
並行プログラミング with Haskell並行プログラミング with Haskell
並行プログラミング with Haskell
 
20150513 legobease
20150513 legobease20150513 legobease
20150513 legobease
 
Sass/Compass講習会
Sass/Compass講習会Sass/Compass講習会
Sass/Compass講習会
 
SpringOne 2016 報告 Reactive APIの設計・実装・使用
SpringOne 2016 報告 Reactive APIの設計・実装・使用SpringOne 2016 報告 Reactive APIの設計・実装・使用
SpringOne 2016 報告 Reactive APIの設計・実装・使用
 

Mais de Makoto Kishimoto

Mais de Makoto Kishimoto (7)

some SHA1 implementation
some SHA1 implementationsome SHA1 implementation
some SHA1 implementation
 
Visulan intro
Visulan introVisulan intro
Visulan intro
 
Shizuoka go lang csp
Shizuoka go lang cspShizuoka go lang csp
Shizuoka go lang csp
 
Tech oyaji ksmakoto_presen
Tech oyaji ksmakoto_presenTech oyaji ksmakoto_presen
Tech oyaji ksmakoto_presen
 
Subprocess no susume
Subprocess no susumeSubprocess no susume
Subprocess no susume
 
Node handson
Node handsonNode handson
Node handson
 
app-c.odp
app-c.odpapp-c.odp
app-c.odp
 

20151121