from javascript to haskell
DESCRIPTION
Kanasan.JS - JS#2TRANSCRIPT
JavaScriptからみたHaskell
2008-01-24UJIHISA, Tatsuhiro
who's this?
•ujihisa
•Osaka Univ. M2
•Fuzzy Rough Sets
•nayutaya - http://www.nayutaya.co.jp
•LiveCoding, ldev, Haskell, On Lisp...
from js to hs
Ruby natural class-based OO
JavaScript prototype-based OO, functional
Haskell simple functional
simplicity
•process serially
•assignment
• loop
• implicit cast
simplicity
•process serially
•assignment
• loop
• implicit cast
no variables
var a = 1;var b = function() { return 1 };
a = 1b = 1
no re-assignment
var a = 1;var a = 2;
a = 1a = 2-- Multiple declarations of `Main.a'
var f = function() { var i = 0; return function() { return i++; }};var g = f();g(); //=> 0g(); //=> 1g(); //=> 2g(); //=> 3g(); //=> 4
principle
write less code
•principle: as possible as you should write less code
•development,maintenance,...always.
notation
aaa(bbb("hahaha", 3)));
aaa (bbb "hahaha" 3)
aaa $ bbb "hahaha" 3
window.addEventListener( "load", function() { alert("a") })
main = putStrLn "a"
var f = function(a, b) { return a + b};f(8, 7) //=> 15
f a b = a + bf 8 7 -- 15
var f = function(a) { var g = function(b) {...}; return g(a);};
f a = g a where g b = ...
var fib = function(n) { return (n == 1) ? 1 : (n == 2) ? 1 : fib(n-2) + fib(n-1);};
fib 1 = 1fib 2 = 1fib n = fib (n-2) + fib (n-1)
(function(a) { return a + 1 })
(function(a) { return a + 1 })(3)//=> 4
(\a -> a + 1)
(\a -> a + 1) 3 -- 4
a + b(+) a b
add a ba `add` b
List Processing
Haskellvs
JavaScript with prototype.js
[1, 2, 3].map(function(i) { return i + 1;}) //=> [2, 3, 4]
map (\i -> i + 1) [1, 2, 3]-- [2, 3, 4]
[1, 2, 3, 4, 5].first() //=> 1[1, 2, 3, 4, 5][3] //=> 4
head [1, 2, 3, 4, 5] -- 1[1, 2, 3, 4, 5] !! 3 -- 4
$R(1, 10).toArray()//=> [1, 2, ..., 10]
$R(1, Infinity).toArray()//...
[1..10]
[1..]
head [1..] -- 1head tail [1..] -- 2[1..] !! 10 -- 11
curry
f a b c = a + b + cf a b = (\c -> a + b + c)f a = (\b -> (\c -> a + b + c))f = (\a -> (\b -> (\c -> a + b + c)))
f 3 5 7 -- 15
var f = function(a) { return function(b) { return function(c) { return a + b + c }}};f(3)(5)(7) //=> 15
f a b = a + bf a b = (+) a bf = (+)
addOne a = 1 + aaddOne a = (+) 1 aaddOne = (+) 1addOne = (1 +)
map (1 +) [1, 2, 3]
list comprehension
[ x + y | x <- [1, 2], y <- [10, 20]]
tmp = [];[1, 2].each(function(x) { [10, 20].each(function(y) { tmp.push(x + y) })});
{x + y|x ! X, y ! Y }
[ x | x <- [1..], x `mod` 2 == 0, x < 10]
tmp = [];$R(1, Infinity).each(function(x) { if (x % 2 == 0 && x < 10) { tmp.push(x) }});
{x|x ! N, x " 0 mod 2, x < 10}
fib again
fib = 1 : 1 : zipWith (+) fib (tail fib)
how to use
•sudo port install ghc
•HotMac :-)
•runghc a.hs
•ghc a.hs && ./a.out
•ghci
for what?
•draft
•step up
•production
Monadius
HSP
HaskellSchemeProlog
•lazy evaluation
•monad
•type inference
thank you!