2008-01-25 tangible value

35
Tangible Value in Haskell 1 Friday, January 25, 2008

Upload: lin-jen-shin

Post on 12-May-2015

402 views

Category:

Technology


0 download

TRANSCRIPT

Page 1: 2008-01-25 Tangible Value

Tangible Valuein Haskell

1Friday, January 25, 2008

Page 2: 2008-01-25 Tangible Value

•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

Page 3: 2008-01-25 Tangible Value

Eros3Friday, January 25, 2008

Page 4: 2008-01-25 Tangible Value

4Friday, January 25, 2008

Page 5: 2008-01-25 Tangible Value

applications:

1. user-friendly2. usable3. concrete4. visual

libraries:

1. programmer-friendly2. composable3. abstract4. syntactic

5Friday, January 25, 2008

Page 6: 2008-01-25 Tangible Value

•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

Page 7: 2008-01-25 Tangible Value

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

Page 8: 2008-01-25 Tangible Value

TV8Friday, January 25, 2008

Page 9: 2008-01-25 Tangible Value

原始程式

9Friday, January 25, 2008

Page 10: 2008-01-25 Tangible Value

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

Page 11: 2008-01-25 Tangible Value

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

Page 12: 2008-01-25 Tangible Value

抽出I/O

12Friday, January 25, 2008

Page 13: 2008-01-25 Tangible Value

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

Page 14: 2008-01-25 Tangible Value

type GradingStr = String -> StringgradingStr :: GradingStr

grades_2 = readFile "tasks" >>= return . gradingStr >>= putStr

14Friday, January 25, 2008

Page 15: 2008-01-25 Tangible Value

inTV

15Friday, January 25, 2008

Page 16: 2008-01-25 Tangible Value

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

Page 17: 2008-01-25 Tangible Value

Eros17Friday, January 25, 2008

Page 18: 2008-01-25 Tangible Value

(1)18Friday, January 25, 2008

Page 19: 2008-01-25 Tangible Value

視覺化19Friday, January 25, 2008

Page 20: 2008-01-25 Tangible Value

20Friday, January 25, 2008

Page 21: 2008-01-25 Tangible Value

21Friday, January 25, 2008

Page 22: 2008-01-25 Tangible Value

22Friday, January 25, 2008

Page 23: 2008-01-25 Tangible Value

23Friday, January 25, 2008

Page 24: 2008-01-25 Tangible Value

(2)24Friday, January 25, 2008

Page 25: 2008-01-25 Tangible Value

融合25Friday, January 25, 2008

Page 26: 2008-01-25 Tangible Value

26Friday, January 25, 2008

Page 27: 2008-01-25 Tangible Value

27Friday, January 25, 2008

Page 28: 2008-01-25 Tangible Value

28Friday, January 25, 2008

Page 29: 2008-01-25 Tangible Value

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

Page 30: 2008-01-25 Tangible Value

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

Page 31: 2008-01-25 Tangible Value

(3)31Friday, January 25, 2008

Page 32: 2008-01-25 Tangible Value

MV分離

32Friday, January 25, 2008

Page 33: 2008-01-25 Tangible Value

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

Page 34: 2008-01-25 Tangible Value

•TypeCompose

•DeepArrow

•DataDriven

•Phooey

Eros

•TV

•GuiTV

•wxHaskell

•wxWidgets

34Friday, January 25, 2008