-- Fortgeschrittene Funktionale Programmierung, -- LMU, TCS, Wintersemester 2015/16 -- Steffen Jost, Alexander Isenko -- -- Übungsblatt 11. 13.01.2016 -- -- Teilaufgabe -- A11-2 Yesod Grundlagen (Routing & Handling) -- {-# LANGUAGE ViewPatterns #-} {-# LANGUAGE MultiParamTypeClasses #-} {-# LANGUAGE OverloadedStrings #-} {-# LANGUAGE TypeFamilies #-} {-# LANGUAGE TemplateHaskell, QuasiQuotes #-} module Main where import Yesod import Data.Text (Text) import qualified Data.Text as T {- Ausgehend von dem minimalen Yesod Beispielen auf Folie 09-12, erstellen Sie eine kleine Webseite mit Yesod, welche Integer-Zahlen addieren und multiplizieren kann. Zur Übung der Grundlagen des Routings möchten wir dies unsinnigerweise über die URL-Pfade der Webseite machen: * http://localhost:3000/24/plus/373/ist zeigt eine Seite an, welche die Zahl 397 anzeigt. * http://localhost:3000/5/mal/-13/ist zeigt eine Seite an, welche die Zahl -65 anzeigt. * http://localhost:3000/5/plus/-1foo3/ist zeigt eine Hilfseite an, welche darauf hinweist, dass nur ganze Zahlen erlaubt sind. * jeder unsinniger Pfad wie etwa http://localhost:3000/5/foo/-13/ist zeigt eine Hilfseite an, die sagt welche Rechenoperationen erlaubt sind. Hinweis: Yesod verwendet Data.Text, ein effizienter Ersatz für den ineffizienten Typ String. Modul Data.Text stellt Methoden zur Bearbeitung von Werte dieses Typs bereit, hier eine Auswahl davon: pack :: String -> Text unpack :: Text -> String append :: Text -> Text -> Text strip :: Text -> Text null :: Text -> Bool length :: Text -> Int -} {- LÖSUNGSVORSCHLAG -} main :: IO () main = warp 3000 CalcApp data CalcApp = CalcApp data ArithOp = ArithAdd | ArithMult deriving (Show, Eq, Read) instance PathPiece ArithOp where fromPathPiece "plus" = Just ArithAdd fromPathPiece "mal" = Just ArithMult fromPathPiece _ = Nothing toPathPiece ArithAdd = "plus" toPathPiece ArithMult = "mal" mkYesod "CalcApp" [parseRoutes| / IndexR GET !#Int/#ArithOp/#Int/ist MathR GET !#Text/#ArithOp/#Text/ist MathErrR GET |] getIndexR :: Handler Html getIndexR = defaultLayout $ do setTitle "math!" [whamlet|

Math!

We support: