TOP met iTasks 2
Gebruik van return Een task levert een resultaat van type: Task a op waarbij a een Clean type is. Het is ook mogelijk iets van type Task a op te leveren zonder enterInformation o.i.d te gebruiken. Dit gaat mbv het return statement (dit is iets anders dan de return in Java, het is eigenlijk gewoon een functie) 8-6-2019
Voorbeeld return recTasks :: Task Int recTasks = enterInformation "Geef positief getal " [] >>= herhaalTaak 0 herhaalTaak :: Int Int -> Task Int herhaalTaak a 0 = viewInformation “Som" [] a herhaalTaak a n = enterInformation "Getal" [] >>= \g->herhaalTaak (a+g) (n-1) Netter is: herhaalTaak a 0 = return a En in aanroep >>= herhaalTaak 0 a >>= \a -> viewInformation “Som" [] a 8-6-2019
Hogere Orde Taken Een hogere orde taak is een taak die een taak als argument of als resultaat kan opleveren Hogere orde taken maken het mogelijk om algemene voorschriften (patronen) te maken die later met concrete taken kunnen worden ingevuld. doAndShow :: (Task a) -> Task a | iTask a doAndShow task = task >>= \a -> viewInformation "Het resultaat is" [] a 8-6-2019
Hogere Orde Taken Mbv hogere orde constructies kan men algemene herhaal constructies maken. Herhaal een taak net zolang tot het resultaat aan een bepaalde conditie voldoet repeatTask :: (a -> Bool) (Task a) -> Task a | iTask a repeatTask cond task = task >>= \a -> if (cond a)(return a)(repeatTask cond task) 8-6-2019
Hogere Orde Taken Gebruik repeatTask: getal raden repeatExample :: Task Int repeatExample = enterInformation "Geef te raden getal" [] >>= \g -> repeatTask (\a -> a == g) (enterInformation "Raad het getal" []) 8-6-2019
Kiezen Kiezen kan met enterChoice (kies 1) of enterMultipleChoice (kies meerdere) chooseExample :: Task Int chooseExample = enterChoice "Kies maar wat" [] [1..5] mchooseExample :: Task [Int] mchooseExample = enterMultipleChoice "Kies maar wat" [] [1..10] 8-6-2019
And - Or iTasks heeft mogelijkheden om taken parallel uit te voeren. De simpelste zijn And en Or. Later volgen er nog anderen. //Simple And doBoth :: Task (Int,Int) doBoth = recTasks -&&- chooseExample //Simple Or doEither :: Task Int doEither = recTasks -||- chooseExample 8-6-2019
Acties Normale enterInformation taken kunnen alleen met Ok afgesloten worden In de praktijk wil je ook taken kunnen annuleren e.d Dit kan met acties Voor veel voorkomende acties bestaan er handige shortcuts :: Action = Action String| ActionOk| ActionCancel| ActionYes| ActionNo|ActionQuit|ActionClose | … 8-6-2019
Acties actionTest :: Task Int actionTest = updateInformation "Geef getal" [] 33 >>* [OnAction (Action "1") hasValue (return o getValue) ,Always (Action "2") (return 42) ,AnyTime (Action "3") f ,WithoutResult (Action "4") (return 43) ,WithResult (Action "5") (\a -> a > 5) (\a -> return (a+1)) ,WhenValid (\a -> a == 23) (\a -> return (a+2)) ,WhenStable (\a -> return (a+67))] where f (Just r) = return r f Nothing = return 42 hasValue (Value _ _) = True hasValue _ = False getValue (Value a _) = a 8-6-2019
Acties Voorbeeld van handig gebruik van acties Voer een aantal getallen na elkaar in tot de gebruiker het genoeg vindt. intList :: Task [Int] intList = enterInformation "Please fill in the form" [ ] >>* [Always (Action "Quit") (return []) ,WithResult (Action "Add one") (const True) (\p -> intList >>= \ps -> return [p:ps]) ,WithResult (Action "Done") (const True) (\p -> return [p]) ] 8-6-2019
Acties Palindrone met acties. palindrome :: Task (Maybe String) = enterInformation "Enter a palindrome" [] >>* [ WithResult ActionOk palindrome (\p -> return (Just p)) , Always ActionCancel (return Nothing) ] where palindrome s = lc == reverse lc // nodig omdat array geen reverse kent where lc :: [Char] lc = fromString s 8-6-2019
Acties Continu monitoren tot een bepaalde conditie geldt raadGetal = enterInformation "Raad het getal" [] >>* [WhenValid (\a -> a == 23) (\a -> return (a+2)) ,Always ActionCancel (return 42) ] 8-6-2019