SlideShare a Scribd company logo
1 of 94
Download to read offline
初めてのHaskell (表)初めてのHaskell (表)
Shizuoka.hs
@karky7
2019/11/30
1
自己紹介 其ノ一自己紹介 其ノ一
twitter: @karky7
2
自己紹介 其ノ二自己紹介 其ノ二
contribute
gentoo-haskellコミッタ
日本OpenSolarisユーザーグループ会
キリン一番搾り売上貢献
取得免許
自動2輪中型免許
第2種アル中ハイマー
●●3級
3
アウトドア派アウトドア派
4
●●●●
5
gentoo-haskellgentoo-haskell
6
よろしくお願いします
7
初めに初めに
私自身Haskellの達人ではありませんので、haskellにおける正確な
表記や説明を間違う事もあるかと思いますのでご了承下さい。
今回は、Haskellをざっくりと説明していきます
詳細については、今後のShizuoka.hsにご期待下さい。
8
HaskellとはHaskellとは
純粋関数型プログラミング言語
9
特徴特徴
代入がない
純粋性
遅延評価
高階関数
モナド
静岡のOOPプログラマーが●エ●●ンにされるには十分な要素が
揃っています
10
初めに言っておきますが
君たちが思い描くような、 エ●●ン●ではないです
…
むしろこういう状態です
11
ググるな危険
12
では、始めましょう…….では、始めましょう…….
13
環境構築環境構築
14
stackstack
haskellのプロジェクト作成やライブラリ管理などを
行うためのコマンド
15
stackのインストールstackのインストール
or
stackコマンドとbuildに必要なパッケージ
全てがインストールされます
$ curl -sSL https://get.haskellstack.org/ | sh
$ wget -qO- https://get.haskellstack.org/ | sh
16
LTSバージョンについてLTSバージョンについて
LTS(Long Term Support Release)、ライブラリ間の依存関係をまとめ
ているバージョンセット情報
lts-12.26で定義されているghcがインストールされます、指定しない
場合、その時の最新のltsバージョンのghcがインストールされます
パケ死する恐れがあるのでご自宅でご利用ください
$ stack setup --resolver lts-12.26
stackage: https://www.stackage.org/
17
パッケージのインストールパッケージのインストール
yesodパッケージが必要とする依存パッケージ全てが
インストールされます
$ stack install yesod
hackage: https://hackage.haskell.org/
18
追加ライブラリの利用追加ライブラリの利用
プロジェクトで新たなライブラリを利用する場合、プロジェクト配下
のpackage.yamlのdependencies:へパッケージをバージョンを指定
せず追記します
dependencies:
- base >= 4.7 && < 5
... 以下続く
- mecab
19
ltsに未登録なパッケージのインストールltsに未登録なパッケージのインストール
プロジェクト配下のstack.yamlのextra-deps:セクションへライブラリ
をバージョン指定で追記します
stack.yaml
extra-deps:
- mecab-0.4.0
$ stack install mecab
20
コマンドラインプロジェクトを作るコマンドラインプロジェクトを作る
newでプロジェクトepronを作成
simple-hpackは作成するテンプレート
$ stack new epron --resolver lts-12.26 simple-hpack
21
その他のテンプレートその他のテンプレート
目的のプロジェクトの雛形を作成してくれます
simple-library
ライブラリ作成
yesod-mysql
Yesod + MySQLデータベース
yesod-postgres
Yesod + PostgreSQLデータベース
stack-tmp: https://github.com/commercialhaskell/stack-templates
22
実行実行
プロジェクトのディレクトリで実行
.stack-work以下のbinディレクトリ等に配備されたコマンド
$ stack build
$ stack run
...
hello world
$ stack exec -- epron
23
コマンドのインストールコマンドのインストール
$HOME/.local/bin へバイナリがインストールされます
$ stack install
...
Copied executables to /home/cuomo/.local/bin:
- epron
$ which epron
/home/cuomo/.local/bin/epron
24
ソースコードの配布ソースコードの配布
epron-0.1.0.0.tar.gzが作成されます
$ stack sdist
Getting file list for /home/cuomo/temp/epron/
epron> List of package sources written to file
...
/home/cuomo/temp/epron/.stack-work/....../epron-0.1.0.0.tar.gz
No 'synopsis' or 'description' field.
..
25
システムへインストールシステムへインストール
/usr/local/bin…の方へインストールされます
$ tar -xzvf epron-0.1.0.0.tar.gz
$ cd epron-0.1.0.0
$ runghc Setup.hs configure
$ runghc Setup.hs build
$ sudo runghc Setup.hs install
Installing executable epron in /usr/local/bin
26
hackageへ登録hackageへ登録
hackage: https://hackage.haskell.org/
27
スクリプトとして実行可能スクリプトとして実行可能
-- Hoge.hs
main :: IO ()
main = putStrLn "Hello ●エ●●ン"
$ runghc Hoge.hs
Hello ●エ●●ン
28
バイナリへビルドも可能バイナリへビルドも可能
$ ghc -o Epuron Hoge.hs
[1 of 1] Compiling Main ( Hoge.hs, Hoge.o )
Linking Epuron ...
$ ./Epuron
Hello ●エ●●ン
29
ghcighci
ghcインタープリター
30
ghcighci
とりあえずこれを使ってこれから説明していきます
$ stack exec -- ghci
GHCi, version 8.6.5: http://www.haskell.org/ghc/ :? for help
Prelude>
31
ghciコマンドghciコマンド
:t ・・・ 型を表示
:i ・・・ 情報を表示
:k ・・・ 型の型を表示
:m ・・・ モジュールのインポート
:bro ・・・ モジュールの一覧表示
:l ・・・ ファイルのロード
とりあえずこれだけ覚えておけば徘徊可能
32
ghcighci
モジュールの読み込みや型の情報等を取得できる
$ ghci
Prelude> 1 + 2
3
Prelude> :t "123"
"123" :: [Char]
Prelude> :i Maybe
data Maybe a = Nothing | Just a -- Defined in ‘GHC.Maybe’
instance Applicative Maybe -- Defined in ‘GHC.Base’
...
Prelude> :k Maybe
Maybe :: * -> *
Prelude> :m +Data.Text
Prelude Data.Text> :bro
33
データ型データ型
34
数値型数値型
Int(上限有り整数)
Float(単精度)
Double(倍精度)
Integer(上限無し整数)
Rational(有理数)
Word8(8bit符号無整数)
Word16、Word32… などなど
35
文字型文字型
Char(マルチバイト利用可)
String([Char]と同じ)
ByteString(バイト列)
Lazy(遅延評価版)
Strict(正格評価版)
Text(Unicode系)
Lazy(遅延評価版)
Strict(正格評価版)
36
リスト型リスト型
配列へ格納できる型は同じもの
data [] a = [] | a : [a]
Prelude> 1 : [2]
[1,2]
Prelude> [1] ++ [2,3]
[1,2,3]
Prelude> "ABC" ++ "D"
"ABCD"
Prelude> ("ABC" ++ "D") !! 2
'C'
37
リスト型リスト型
内包表記など
Prelude> [1..10]
[1,2,3,4,5,6,7,8,9,10]
Prelude> [(x,y,z) | x <- [1..100], y <- [1..100], z <- [1..100], (z^2 == x^2
+ y^2)]
[(3,4,5),(4,3,5),..,(45,60,75),(48,14,50),(48,20,52),(48,36,60),(48,55,73),
(48,64,80),(51,68,85),(52,39,65),(54,72,90),(55,48,73),(56,33,65),(56,42,70),
(57,76,95),(60,11,61),(60,25,65),(60,32,68),(60,45,75),(60,63,87),
(60,80,100),
(63,16,65),(63,60,87),(64,48,80),(65,72,97),(68,51,85),(70,24,74),(72,21,75),
(72,30,78),(72,54,90),(72,65,97),(75,40,85),(76,57,95),(77,36,85),(80,18,82),
(80,39,89),(80,60,100),(84,13,85),(84,35,91),(96,28,100)]
Prelude> take 5 [1,5..]
[1,5,9,13,17]
38
タプル型タプル型
(,)が2引数関数
タプルの中のデータの型は自由
data (,) a b = (,) a b
Prelude> :t (,)
(,) :: a -> b -> (a, b)
Prelude> (,) 1 "AAA"
(1,"AAA")
Prelude> :t (,) 1 "AAA"
(,) 1 "AAA" :: Num a => (a, [Char])
39
タプル型タプル型
Pythonのような配列的なインデックスアクセスはできない
もしくはパターンマッチでとる
Prelude> (1, "ABC") !! 1
<interactive>:68:1: error:
• Couldn't match expected type ‘[a]’
with actual type ‘(Integer, [Char])’
Prelude> snd (1, "ABC")
"ABC"
func :: Num a => (a, [Char]) -> a
func (v, s) = v
40
Maybe型Maybe型
「ある」か「ない」
Maybeは型構成子
Nothing, Justは値構成子
aには色々な型が入る
data Maybe a = Nothing | Just a
data Maybe Int = Nothing | Just Int
41
Either型Either型
Le がエラーでRightが成功、エラー時に何かの情報を返せる
Err型はEitherのシノニム
data Either a b = Left a | Right b
type Err = Either String Int
42
ユーザー定義型ユーザー定義型
data Epron = Epron Int String | HadakaEpron (Maybe String)
data Epron = Epron
{
pocketNum :: Int
, yarouName :: String
} | HadakaEpron { hadakaName :: Maybe String }
43
型の初期化型の初期化
引数の順に、パラメータを与える
Prelude> data Epron = Epron Int String | HadakaEpron (Maybe String)
Prelude> let ep = Epron 10 "新作"
Prelude> let hep = HadakaEpron $ Just "モッチー"
44
ユーザー定義型ユーザー定義型
レコードを利用した初期化も可能
Prelude> :{
Prelude| data Epron = Epron
{
pocketNum :: Int
, yarouName :: String
}
| HadakaEpron { hadakaName :: Maybe String }
Prelude| :}
Prelude> let ep = Epron { pocketNum = 10, yarouName = "新作" }
45
ユーザー定義型ユーザー定義型
関数をとる型の定義
data EpronMan a b c = EpronMan
{
pocketNum :: Int
, yarouName :: String
, f :: (a -> b -> c)
}
Prelude> let epm = EpronMan 10 "新作" (+)
Prelude> :t epm
epm :: Num c => EpronMan c c c
46
型の型型の型
型を具体型にするための必要な型引数を表示
Prelude> :k Maybe
Maybe :: * -> *
Prelude> :k Int
Int :: *
Prelude> :k Either
Either :: * -> * -> *
47
関数関数
48
関数の見方関数の見方
(+)はa型の2引数をとってa型を返す関数
a型はNumクラスのインスタンスである必要がある
(+) はセクションという
Prelude> :t (+)
(+) :: Num a => a -> a -> a
Prelude> (+) 1 1
2
49
カリー化カリー化
haskellでは全ての関数は1つしか引数をとらない
実際の関数より少ない引数を適用する事を部分適用という
take :: Int -> [a] -> [a]
Prelude> :t take 10
take 10 :: [a] -> [a] -- takeに10だけ適用した1引数関数
Prelude>
50
再帰関数再帰関数
再帰することでループと同等のことを行う
-- UpperCase.hs
import Data.Char (toUpper)
upperCase :: String -> String
upperCase (x:xs) = toUpper x : upperCase xs -- 引数は 'a' : ['b', 'c', 'd'] の
ように分割
upperCase [] = [] -- 停止条件
Prelude> :l UpperCase.hs
[1 of 1] Compiling Main ( UpperCase.hs, interpreted )
Ok, one module loaded.
*Main> upperCase "abc123DEF"
"ABC123DEF"
51
高階関数高階関数
関数に別の関数を適用して新しい関数を作る
第1引数にupperCaseを適用
map :: (a -> b) -> [a] -> [b] -- 第1引数が関数 (a -> b)
*Main> :t upperCase
upperCase :: String -> String
*Main> :t map upperCase
map upperCase :: [String] -> [String]
52
中置法中置法
10 `div` 5 -- div :: Integral a => a -> a -> a
53
ポイントフリースタイルポイントフリースタイル
こういう形式の関数については(.)ドットを使って連結
カリー化によって第1引数は省略可能
y = f(g(x))
foo = f . g
54
パターンマッチパターンマッチ
引数引数
アズパターンアズパターン
foo (Just _) = ....
bar (x:xs) = ...
foo val@(Just _) = ....
55
制御構造制御構造
56
ifif
thenとelseを必ず書く
結果1と結果2の型は同じ
if Bool式
then
結果1
else
結果2
57
casecase
場合分けで利用
case result of
(Just xs) -> Just $ map upperCase xs
otherwise -> Nothing
58
データ操作データ操作
59
フィルターフィルター
リストの値を条件によって抽出する
Prelude> filter :: (a -> Bool) -> [a] -> [a]
Prelude> filter odd [1,2,3,4,5]
[1,3,5]
60
畳み込み畳み込み
ある集合の値を特定の値にまとめる
Prelude> :t foldr :: Foldable t => (a -> b -> b) -> b -> t a -> b
Prelude> foldr (+) 0 [1,2,3] -- 1 + (2 + (3 + 0))
6
Prelude> :i []
instance Foldable [] -- Defined in ‘Data.Foldable’
61
型クラス型クラス
62
型クラス型クラス
Num
Eq
Ord
Show
Read
63
derivingderiving
型に振る舞いを与えます
data Epron = Epron Int deriving(Eq, Show)
Prelude> data Epron = Epron Int deriving(Eq, Show)
Prelude> let ep1 = Epron 1
Prelude> let ep2 = Epron 1
Prelude> ep1 == ep2
True
Prelude> ep1
Epron 1
64
derivingderiving
Epron型はOrdクラスのインスタンスでなないので比較できない
比較したい場合、derivingへOrdを追加する
Prelude> ep1 > ep2
<interactive>:11:1: error:
• No instance for (Ord Epron) arising from a use of ‘>’
• In the expression: ep1 > ep2
In an equation for ‘it’: it = ep1 > ep2
Prelude>
65
classclass
同値判定をしたい場合、Eqクラスのインスタンスする
型aのための(==), (/=)を実装する
これをa型をEqクラスのインスタンスにするという
class Eq a where
(==), (/=) :: a -> a -> Bool
x == y = not (x /= y)
x /= y = not (x == y)
66
classclass
deriving(Eq)で以下の実装を自動的に導出してくれる
Epronの引数IntもEqクラスのインスタンスになっている必要がある
class Eq Epron where
(==), (/=) :: Epron -> Epron -> Bool
instance Epron where
Epron x == Epron y = not (x /= y)
Epron x /= Epron y = not (x == y)
67
classclass
その他の型クラス
Bounded(上限下限)
Floating(小数点)
Fraditional(整数)
Integral
Real
68
BoundedBounded
Prelude> :i Bounded
class Bounded a where
minBound :: a
maxBound :: a
69
Bounded – IntBounded – Int
上限と下限をもつ
Prelude> :i Int
instance Bounded Int -- Defined in ‘GHC.Enum’
Prelude> maxBound :: Int
9223372036854775807
Prelude> (maxBound :: Int) + 1
-9223372036854775808
Prelude> minBound :: Int
-9223372036854775808
70
Bounded – IntegerBounded – Integer
際限なく利用可能
maxBound :: Integer
<interactive>:14:1: error:
• No instance for (Bounded Integer)
arising from a use of ‘maxBound’
• In the expression: maxBound :: Integer
In an equation for ‘it’: it = maxBound :: Integer
71
多相性多相性
72
パラメトリック多相パラメトリック多相
head関数は色々な型のリストに利用可能なパラメータをもつ
Prelude> :t head
head :: [a] -> a
73
サブタイプ多相サブタイプ多相
型によって動作を変える
class Yabai a where
hagasu :: a -> String
data Epron = Epron deriving(Show)
data Hadaka = Hadaka deriving(Show)
instance Yabai Epron where
hagasu v = "Yamete ===> " ++ show(v)
instance Yabai Hadaka where
hagasu v = "Marumie ===> " ++ show(v)
74
入出力入出力
IO発行する関数は副作用がある関数などと呼ばれる
IOに包まれた値を返してくる、IOモナドという
*Main> :m +System.IO
*Main System.IO> :t openFile
openFile :: FilePath -> IOMode -> IO Handle
75
入出力入出力
import System.IO
main :: IO ()
main = epronRead >>= putStrLn -- (>>=)バインド
-- epronRead >>= msg -> putStrLn msg
epronRead :: IO String
epronRead = do
handle <- openFile "epron.txt" ReadMode
dat <- hGetContents handle
return dat
$ runghc FileOpen.hs
丸●じゃないか!
76
モナドモナド
77
FunctorFunctor
純粋な関数(a -> b)をあたえる
リフトアップされた(f a -> f b)関数を返す
-- Functor (f :: * -> *)
fmap :: Functor f => (a -> b) -> f a -> f b
78
FunctorFunctor
純粋な関数(a -> b)とファンクタ値(f a)を与える
(f a)のaを(a -> b)へ適用し、ファンクタ値(f b)を返す
-- Functor (f :: * -> *)
fmap :: Functor f => (a -> b) -> f a -> f b
79
fmapfmap
not関数を、Justに包まれている値へ適用できた
Prelude> :t not
not :: Bool -> Bool
Prelude> :t fmap not
fmap not :: Functor f => f Bool -> f Bool -- f にJustで固定してみる
Prelude> :t fmap not (Just True)
fmap not (Just True) :: Maybe Bool
Prelude> fmap not (Just True)
Just False
80
ApplicativeApplicative
pureである文脈を作ることができる
ある文脈をもつ関数を、同じ文脈をもつ値に適用する
-- Functor f => Applicative (f :: * -> *)
pure :: a -> f a
(<*>) :: f (a -> b) -> f a -> f b
81
ApplicativeApplicative
pureである文脈を作ることができる
文脈fはpureが呼ばれた文脈で決まる
Prelude Control.Monad> pure (Just True)
Just True
Prelude Control.Monad> :t pure (Just True)
pure (Just True) :: Applicative f => f (Maybe Bool)
Prelude Control.Monad> pure (+1) <*> Just 10
Just 11
82
MonadMonad
returnでmに包む
mに包まれたaを取り出し(a -> m b)関数へaを適用する
適用した結果bをmに包んで返す
class Applicative m => Monad (m :: * -> *) where
(>>=) :: m a -> (a -> m b) -> m b
(>>) :: m a -> m b -> m b
return :: a -> m a
83
MonadMonad
身近な利用例だと、mはモナドなので、IOモナドに置き換えてみる
-- :k IO
-- IO :: * -> *
IO a -> (a -> IO b) -> IO b
epronRead >>= msg -> putStrLn msg
epronRead >>= putStrLn
84
MonadMonad
この関数の出口は、JustかNothingのうち2つ
justEpron :: String -> Maybe String
justEpron
| "は●か" = Just "は●か"
otherwise = Nothing
85
MonadMonad
連鎖することができる
どこかでNothingになったら式の結果はNothing
途中で「は●かです」を宣言したことが失敗
*Main > return "は●か" >>= justEpron >>= justEpron >>= justEpron
Just "は●か"
*Main > return "は●か" >>= justEpron >>= s -> justEpron (s ++ "です") >>=
justEpron
Nothing
86
MonadMonad
よく分からないモナドですが、詳細は今後の勉強会でも行っていき
たいと思います
87
まとめまとめ
88
haskellの良いところhaskellの良いところ
強力な型システム
強静的型付+関数型が間違いの無いコードを保証してくれる
ランタイムエラーにほぼ遭遇しない
小規模から大規模まで対応可能
89
haskellの悪いところhaskellの悪いところ
ビルドが長い
学習コストが高い
他言語をやらなくなってしまう (私だけかもしれません)
心が折れて止めてしまう人がいる
90
Haskellの学習において
心が折れそうになったら、エ●●ン●を思いだして下さい
きっと頑張れるはずです
91
ロゴロゴ
Shizuoka.hsのかわいいキャラクターが決まりました
92
今後もShizuoka.hsを定期的に開催していきたいと今後もShizuoka.hsを定期的に開催していきたいと
思います、思います、静岡県静岡県ははお茶お茶とと伊勢海老伊勢海老ととHaskellHaskellというという
ことを世界に知らしめていきましょう!ことを世界に知らしめていきましょう!
93
ありがとうございましたありがとうございました
94

More Related Content

What's hot

ECMAScript 6 Features(PDF 版)
ECMAScript 6 Features(PDF 版)ECMAScript 6 Features(PDF 版)
ECMAScript 6 Features(PDF 版)taskie
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターンMoriharu Ohzu
 
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」fukuoka.ex
 
Ocaml lecture slides 01 at axsh
Ocaml lecture slides 01 at axshOcaml lecture slides 01 at axsh
Ocaml lecture slides 01 at axshTomofumi Hayashi
 
Boost jp9 program_options
Boost jp9 program_optionsBoost jp9 program_options
Boost jp9 program_optionsnyaocat
 
すごいHaskell読書会#10
すごいHaskell読書会#10すごいHaskell読書会#10
すごいHaskell読書会#10Shin Ise
 
Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Yoshio Terada
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会Akihiko Matuura
 
わかるコードを書くために For writing clean code
わかるコードを書くために For writing clean codeわかるコードを書くために For writing clean code
わかるコードを書くために For writing clean codeEyes, JAPAN
 
Van laarhoven lens
Van laarhoven lensVan laarhoven lens
Van laarhoven lensNaoki Aoyama
 
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールこれからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールNobuhisa Koizumi
 
Parsing Left Recursive PEG
Parsing Left Recursive PEGParsing Left Recursive PEG
Parsing Left Recursive PEGTakayuki Goto
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11nekko1119
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるHideyuki Tanaka
 
モナドがいっぱい!
モナドがいっぱい!モナドがいっぱい!
モナドがいっぱい!Kenta Sato
 
すごいH 第12章モノイド
すごいH 第12章モノイドすごいH 第12章モノイド
すごいH 第12章モノイドShinta Hatatani
 
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2Masatoshi Tada
 
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルJava SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルなおき きしだ
 

What's hot (20)

Map
MapMap
Map
 
ECMAScript 6 Features(PDF 版)
ECMAScript 6 Features(PDF 版)ECMAScript 6 Features(PDF 版)
ECMAScript 6 Features(PDF 版)
 
クロージャデザインパターン
クロージャデザインパターンクロージャデザインパターン
クロージャデザインパターン
 
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
【LT版】Elixir入門「第7回:Python/KerasをElixirから繋いでアレコレする」
 
Ocaml lecture slides 01 at axsh
Ocaml lecture slides 01 at axshOcaml lecture slides 01 at axsh
Ocaml lecture slides 01 at axsh
 
Boost jp9 program_options
Boost jp9 program_optionsBoost jp9 program_options
Boost jp9 program_options
 
すごいHaskell読書会#10
すごいHaskell読書会#10すごいHaskell読書会#10
すごいHaskell読書会#10
 
Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016Java Puzzlers JJUG CCC 2016
Java Puzzlers JJUG CCC 2016
 
C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会C++ Template Meta Programming の紹介@社内勉強会
C++ Template Meta Programming の紹介@社内勉強会
 
わかるコードを書くために For writing clean code
わかるコードを書くために For writing clean codeわかるコードを書くために For writing clean code
わかるコードを書くために For writing clean code
 
Van laarhoven lens
Van laarhoven lensVan laarhoven lens
Van laarhoven lens
 
これからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツールこれからの「言語」の話をしよう ―― 未来を生きるためのツール
これからの「言語」の話をしよう ―― 未来を生きるためのツール
 
Parsing Left Recursive PEG
Parsing Left Recursive PEGParsing Left Recursive PEG
Parsing Left Recursive PEG
 
Visual C++で使えるC++11
Visual C++で使えるC++11Visual C++で使えるC++11
Visual C++で使えるC++11
 
C++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISるC++コミュニティーの中心でC++をDISる
C++コミュニティーの中心でC++をDISる
 
C++14 Overview
C++14 OverviewC++14 Overview
C++14 Overview
 
モナドがいっぱい!
モナドがいっぱい!モナドがいっぱい!
モナドがいっぱい!
 
すごいH 第12章モノイド
すごいH 第12章モノイドすごいH 第12章モノイド
すごいH 第12章モノイド
 
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
ステップ・バイ・ステップで学ぶラムダ式・Stream api入門 #jjug ccc #ccc h2
 
Java SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイルJava SE 8 lambdaで変わる プログラミングスタイル
Java SE 8 lambdaで変わる プログラミングスタイル
 

Similar to 初めてのHaskell (表)

すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪yashigani
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~Nobuhisa Koizumi
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2Masao Kato
 
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミングOuka Yuka
 
Material
MaterialMaterial
Material_TUNE_
 
What Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットWhat Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットTaisuke Oe
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Ransui Iso
 
10分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 110110分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 1101Nobuaki Oshiro
 
Everyday Life with clojure.spec
Everyday Life with clojure.specEveryday Life with clojure.spec
Everyday Life with clojure.specKent Ohashi
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Ransui Iso
 
XP寺子屋第9回「シンプル・プログラミング」
XP寺子屋第9回「シンプル・プログラミング」XP寺子屋第9回「シンプル・プログラミング」
XP寺子屋第9回「シンプル・プログラミング」takepu
 
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Lispmeetup #53 PythonベースのLisp方言、 HyのすすめLispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Lispmeetup #53 PythonベースのLisp方言、 HyのすすめSatoshi imai
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説do_aki
 
Pythonで始めるDropboxAPI
Pythonで始めるDropboxAPIPythonで始めるDropboxAPI
Pythonで始めるDropboxAPIDaisuke Igarashi
 
10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 Nobuaki Oshiro
 
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」Nagi Teramo
 
Scalamacrosについて
ScalamacrosについてScalamacrosについて
Scalamacrosについてdekosuke
 
おいしいLisp
おいしいLispおいしいLisp
おいしいLispKent Ohashi
 

Similar to 初めてのHaskell (表) (20)

すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪すごいHaskell読書会#1 in 大阪
すごいHaskell読書会#1 in 大阪
 
F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~F#入門 ~関数プログラミングとは何か~
F#入門 ~関数プログラミングとは何か~
 
Clojure programming-chapter-2
Clojure programming-chapter-2Clojure programming-chapter-2
Clojure programming-chapter-2
 
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング(Ruby使いのための)Scalaで学ぶ関数型プログラミング
(Ruby使いのための)Scalaで学ぶ関数型プログラミング
 
Material
MaterialMaterial
Material
 
Haskell超入門 Part.1
Haskell超入門 Part.1Haskell超入門 Part.1
Haskell超入門 Part.1
 
What Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミットWhat Dotty fixes @ Scala関西サミット
What Dotty fixes @ Scala関西サミット
 
Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3Lisp Tutorial for Pythonista : Day 3
Lisp Tutorial for Pythonista : Day 3
 
10分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 110110分で分かるr言語入門ver2.10 14 1101
10分で分かるr言語入門ver2.10 14 1101
 
Everyday Life with clojure.spec
Everyday Life with clojure.specEveryday Life with clojure.spec
Everyday Life with clojure.spec
 
Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2Lisp tutorial for Pythonista : Day 2
Lisp tutorial for Pythonista : Day 2
 
XP寺子屋第9回「シンプル・プログラミング」
XP寺子屋第9回「シンプル・プログラミング」XP寺子屋第9回「シンプル・プログラミング」
XP寺子屋第9回「シンプル・プログラミング」
 
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Lispmeetup #53 PythonベースのLisp方言、 HyのすすめLispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
Lispmeetup #53 PythonベースのLisp方言、 Hyのすすめ
 
PHP AST 徹底解説
PHP AST 徹底解説PHP AST 徹底解説
PHP AST 徹底解説
 
Pythonで始めるDropboxAPI
Pythonで始めるDropboxAPIPythonで始めるDropboxAPI
Pythonで始めるDropboxAPI
 
10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920 10分で分かるr言語入門ver2.9 14 0920
10分で分かるr言語入門ver2.9 14 0920
 
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
「plyrパッケージで君も前処理スタ☆」改め「plyrパッケージ徹底入門」
 
Scalamacrosについて
ScalamacrosについてScalamacrosについて
Scalamacrosについて
 
おいしいLisp
おいしいLispおいしいLisp
おいしいLisp
 
Gorinphp0729
Gorinphp0729Gorinphp0729
Gorinphp0729
 

Recently uploaded

【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)Hiroki Ichikura
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfFumieNakayama
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...博三 太田
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfFumieNakayama
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineerYuki Kikuchi
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?akihisamiyanaga1
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案sugiuralab
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成Hiroshi Tomioka
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)UEHARA, Tetsutaro
 

Recently uploaded (9)

【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
【早稲田AI研究会 講義資料】3DスキャンとTextTo3Dのツールを知ろう!(Vol.1)
 
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdfAWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
AWS の OpenShift サービス (ROSA) を使った OpenShift Virtualizationの始め方.pdf
 
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察  ~Text-to-MusicとText-To-ImageかつImage-to-Music...
モーダル間の変換後の一致性とジャンル表を用いた解釈可能性の考察 ~Text-to-MusicとText-To-ImageかつImage-to-Music...
 
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdfクラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
クラウドネイティブなサーバー仮想化基盤 - OpenShift Virtualization.pdf
 
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
自分史上一番早い2024振り返り〜コロナ後、仕事は通常ペースに戻ったか〜 by IoT fullstack engineer
 
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
CTO, VPoE, テックリードなどリーダーポジションに登用したくなるのはどんな人材か?
 
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
TataPixel: 畳の異方性を利用した切り替え可能なディスプレイの提案
 
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
業務で生成AIを活用したい人のための生成AI入門講座(社外公開版) 2024年4月作成
 
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
デジタル・フォレンジックの最新動向(2024年4月27日情洛会総会特別講演スライド)
 

初めてのHaskell (表)