Haskellの楽しみ:
手続き操作型というパラダイム
田中英行 tanakh@preferred.jp
2011/11/09 技術交流会 @日本ユニシス
田中英行 tanakh@preferred.jp
2011/11/09 技術交流会 @日本ユニシス
・ Haskellは 簡単
・ Haskellは すごい
・ Haskellは 面白い
・ Haskell は簡単ですごく面白い
・ Haskell は面白くてすごいものが簡単に作れる
(あとモナドの話少し)
Webフレームワーク
速い! 安全! 使いやすい!
Haskellによるdaemontoolsの再実装
汎用ドキュメントコンバータ
非常にシンプルなドキュメント型
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
|]
のことは一旦忘れてください
ことさらに取りざたされますが、これはあまり重要じゃない(と思います)です
#include <iostream>
int main()
{
std::cout << "Hello, World!" << std::endl;
return 0;
}
public class Main {
public static void main(String[] args) {
System.out.println("Hello, World!");
}
}
main = putStrLn "Hello, World!"
経験の問題!まずはコードを書いてみましょう
⇒ 初めて使うライブラリでも安心して使える
-- 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の型システムは、広く利用可能な言語の中で、最も強力・かつ扱いやすい部類
とにかく強力!
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
計算コンテクストの1つに過ぎない
では、モナドはなんなのか?
IOモナド(手続き型コンテクスト)を用いるHaskell
(という命名を思いつきました)
モナドが再帰している例:
rep p = p >> rep p <|> mempty
遅延評価じゃなければ…
rep p = (\_ -> p >> rep p () <|> mempty)
一段クロージャに包む必要がある
(これでも遅延評価と同じとは行かない)