Lecture 12 - Haskell Exercises
Auto-generated from
haskell/lecture12/*.hsbysync-notes.sh- edit the .hs files, not this note.
Related: Lecture 1 - Intro to Functional Programming, Haskell - Polymorphism Rule of Thumb
preparation.hs
-- Lecture 12 - Preparation
-- Monadisk parsing
-- (OBS: arket er fra PP 2025 - opgaverne kan ændre sig for 2026)
-- Læsning: Kapitel 13 i Programming in Haskell + podcast.
--
-- Læringsmål:
-- * Forklare de centrale idéer bag Parser-monaden
-- * Forklare hvordan Parser-monaden kan bruges til at bygge parsere
-- * Bygge en parser ved hjælp af monadisk parsing
--
-- Husk!
-- * Genopfrisk kontekstfrie grammatikker og begrebet parsing inden tirsdag.
-- * Hent Parsing.hs fra Moodle (indeholder modulerne og funktionerne fra kap. 13).
-- Kompilér den i en terminal med:
-- ghc -I. --make Parsing.hs
-- Det giver Parsing.hi og Parsing.o - læg dem i samme mappe som denne fil.
-- * Fjern derefter kommentaren fra import-linjen herunder.
-- import Parsing
-- ===== Prep 1 =====
-- Tidligere i kurset så vi, hvordan man kan deklarere en algebraisk datatype for
-- løg. Her skal vi se på heltals-løg:
data Onion = Core Integer | Layer Onion deriving Show
-- Brug Parser-monaden til at definere en parser theonion, der kan parse strenge.
-- Når en streng har den rigtige form, skal parseren give os den tilsvarende værdi
-- af typen Onion.
-- Hvis vi for eksempel giver parseren strengen "LLLLL7", skal vi få
-- Layer (Layer (Layer (Layer (Layer (Core 7)))))
-- theonion :: Parser Onion
-- theonion =
-- >>> parse theonion "LLLLL7"
-- >>> parse theonion "7"
-- >>> parse theonion "LLx"
-- [(Layer (Layer (Layer (Layer (Layer (Core 7))))),"")]
-- [(Core 7,"")]
-- ===== Prep 2 =====
-- Sproget L = { a^n b^n | n >= 0 } er et velkendt eksempel på et kontekstfrit
-- sprog, der ikke også er et regulært sprog. For eksempel er aabb ∈ L, men
-- aab ∉ L. L kan defineres ved hjælp af den kontekstfrie grammatik
--
-- S -> a S b | ε
--
-- Brug Parser-monaden til at definere en parser ab, der genkender sproget L.
-- (arket skriver "abab ∈ L", men abab er ikke på formen a^n b^n - formentlig en
-- tastefejl for aabb)
-- ab :: Parser
-- ab =
-- >>> parse ab ""
-- >>> parse ab "ab"
-- >>> parse ab "aabb"
-- >>> parse ab "aaabbb"
-- >>> parse ab "aab"
-- >>> parse ab "abab"
exercises.hs
-- Lecture 12 - Exercises
-- (placeholder: write the task text as comments, then the solution below)
-- ===== Task 1 =====