Haskellの楽しみ:
手続き操作型というパラダイム

田中英行 tanakh@preferred.jp
2011/11/09 技術交流会 @日本ユニシス

自己紹介

本日の概要


・ Haskellは 簡単

・ Haskellは すごい

・ Haskellは 面白い


・ Haskell は簡単ですごく面白い

・ Haskell は面白くてすごいものが簡単に作れる


(あとモナドの話少し)

最近のHaskellの話題

Yesod

scalable-server

no more event-driven!

angel

pandoc


attoparsec

acid-state

shakespeare

main :: IO ()
main =
writeFile def "test3.xml" $ Document (Prologue [] Nothing []) root []
where
root = Element "html" [] [xml|
<head>
<title>
My #
<b>Title
<body>
<p>foo bar baz
|]

Configurator

Haskellの楽しみ

よくある誤解

今日は

のことは一旦忘れてください


ことさらに取りざたされますが、これはあまり重要じゃない(と思います)です

Haskellは 難しくない

#include <iostream>
int main()
{
std::cout << "Hello, World!" << std::endl;
return 0;
}

Haskellは 難しくない

public class Main {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}

Haskellは 難しくない

main = putStrLn "Hello, World!"

I/Oが苦手?

なんとなくそういう印象を受ける

経験の問題!まずはコードを書いてみましょう

型付けは安心のため

⇒ 初めて使うライブラリでも安心して使える

型は面倒ではない

-- foo :: Num a => a -> a
foo n = n + 1

型は役に立たない?

Java 1.4

class Hoge {
public static void main(String[] args) {
List l;
l.add("string");
Integer n = (Integer)l.indexOf(0); // Oops...
}
}

型は役に立たない?

Java 1.5

class Hoge {
public static void main(String[] args) {
List<String> l;
l.add("string");
Integer n = l.indexOf(0); // Compile Error :)
}
}

型システムの有用性は型システムの表現力に左右される

Haskellの型システム

Haskellの型に特徴的な機能

とにかく強力!

モナド:手続き操作型というパラダイム

モナドに関する疑問

こちらもご参照ください

View more presentations from tanakh

モナドとはどういうものか?

モナドはパラダイムである

モナドとは何か?

Intを返す 何らか の計算

foo :: Monad m => m Int
foo = return 1

Intの状態を持ちBoolを返す 何らか の計算

bar :: MonadState Int m => m Bool
bar = do
state <- get
return $ state == 0

(コンテクストに対してポリモーフィックなことに注意)

モナドのコンテクストの具体例

なぜ、モナドなのか?

モナドで十分な理由

main = do
line <- getLine -- get 'Monads value'
if line == "" -- depend of its value...
then return ()
else do -- changes the built monad
putStrLn line
main

モナドから見た命令型


モナドはパラダイムを抽象化するもの


 (という命名を思いつきました)

IO モナドの正体

MonadIO

MonadControlIO

Identityモナド

モナドを扱う言語で望ましいこと

モナドと遅延評価

モナドが再帰している例:

rep p = p >> rep p <|> mempty

遅延評価じゃなければ…

rep p = (\_ -> p >> rep p () <|> mempty)

一段クロージャに包む必要がある
 (これでも遅延評価と同じとは行かない)

モナドでのプログラミング

まとめ

Happy Haskelling!