Post on 12-May-2015
Tangible Valuein Haskell
1Friday, January 25, 2008
•http://www.youtube.com/watch?v=faJ8N0giqzw
•http://conal.net/papers/Eros/
•http://journal.conal.net/#[[separating IO from logic -- example]]
•http://conal-elliott.blogspot.com/search/label/TV
Conal Elliott
2Friday, January 25, 2008
Eros3Friday, January 25, 2008
4Friday, January 25, 2008
applications:
1. user-friendly2. usable3. concrete4. visual
libraries:
1. programmer-friendly2. composable3. abstract4. syntactic
5Friday, January 25, 2008
•Write programs that do one thing and do it well
•Write programs to work together
•Write programs to handle text streams, because that is a universal interface
UNIX philosophy
Doug McIlroy
6Friday, January 25, 2008
godfat ~/p/l/l/l/proc> ls | sort | cat -n 1 bind.rb 2 chain.rb 3 compose.rb 4 curry.rb
7Friday, January 25, 2008
TV8Friday, January 25, 2008
原始程式
9Friday, January 25, 2008
module Grading where
import Data.List (sort)import Data.Map (Map,empty,keys,insertWith,findWithDefault)import Text.Printf
import Interface.TVimport Interface.TV.OFun() -- work around GHC bug. ticket #1145
10Friday, January 25, 2008
grades = do src <- readFile "tasks" let pairs = map (split.words) (lines src) grades = foldr insert empty pairs mapM_ (draw grades) (sort (keys grades)) where insert (s, g) = insertWith (++) s [g] split [name,mark] = (name, read mark) draw g s = printf "%s\t%s\tAverage: %f\n" s (show marks) avg where marks = findWithDefault (error "No such student") s g avg = sum marks / fromIntegral (length marks) :: Double
11Friday, January 25, 2008
抽出I/O
12Friday, January 25, 2008
gradingStr src = concatMap (draw grades) (sort (keys grades)) where pairs = map (split.words) (lines src) grades = foldr insert empty pairs insert (s, g) = insertWith (++) s [g] split [name,mark] = (name, read mark) draw g s = printf "%s\t%s\tAverage: %f\n" s (show marks) avg where marks = findWithDefault (error "No such student") s g avg = sum marks / fromIntegral (length marks) :: Double
13Friday, January 25, 2008
type GradingStr = String -> StringgradingStr :: GradingStr
grades_2 = readFile "tasks" >>= return . gradingStr >>= putStr
14Friday, January 25, 2008
inTV
15Friday, January 25, 2008
type GradingStr = String -> StringgradingStr :: GradingStr
grades_2 = readFile "tasks" >>= return . gradingStr >>= putStr
gradingStrOut = oLambda (fileIn "tasks") stringOutgradingStrT :: TV KIO GradingStrgradingStrT = tv gradingStrOut gradingStr
grades_3 = runTV gradingStrT
16Friday, January 25, 2008
Eros17Friday, January 25, 2008
(1)18Friday, January 25, 2008
視覺化19Friday, January 25, 2008
20Friday, January 25, 2008
21Friday, January 25, 2008
22Friday, January 25, 2008
23Friday, January 25, 2008
(2)24Friday, January 25, 2008
融合25Friday, January 25, 2008
26Friday, January 25, 2008
27Friday, January 25, 2008
28Friday, January 25, 2008
first :: (a -> a') -> ((a, b) -> (a',b ))second :: (b -> b') -> ((a, b) -> (a ,b'))result :: (b -> b') -> ((a->b) -> (a->b'))
first f = \ (a, b) -> (f a, b)second g = \ (a, b) -> ( a, g b)result g = \ f -> g . f
29Friday, January 25, 2008
sf :: (b->b') -> (a,(b ,c)) -> (a,(b',c))
sf = second.first
frsrf :: (c->c') -> (a->(f,b->(c ,g)),e) -> (a->(f,b->(c',g)),e)
frsrf = first.result.second.result.first
funFirst :: (d -> (c->a)) -> ((d,b) -> (c->(a,b)))
30Friday, January 25, 2008
(3)31Friday, January 25, 2008
MV分離
32Friday, January 25, 2008
type TV a = (Out a, a)
type Out a = ...put :: Put a -> Out aopair :: Out a -> Out b -> Out (a, b)olambda :: In a -> Out b -> Out (a->b)
type In a = ...get :: Get a -> In aipair :: In a -> In b -> In (a,b)
33Friday, January 25, 2008
•TypeCompose
•DeepArrow
•DataDriven
•Phooey
Eros
•TV
•GuiTV
•wxHaskell
•wxWidgets
34Friday, January 25, 2008
•Tangible polymorphism?
•Direct structural tweaks
•Symmetric In/Out (ilambda)
•“GUIs are types” as GUI design guide
•TVs as composable MVC
To explore
35Friday, January 25, 2008