Seminar 2 - Teil I
Einfache Datentypen - Tim Richter
seminar02_1.lhs — LHS source code, 1Kb
Dateiinhalt
---------------------------------------------------------------------- -- -- Seminar Theoretische Informatik \ \ -- "Funktionale Programmierung mit Haskell" \ \ --- -- Universität Potsdam SS 2014 / /\ -- -- Tim Richter / Mario Frank / / \ -- -- 2: Einfache Typen I ---------------------------------------------------------------------- > module Seminar02_1 where > import Prelude hiding (Bool, False, True, (&&), (||)) ---------------------------------------------------------------------- -- Bool ---------------------------------------------------------------------- > data Bool = False | True deriving Show Funktionsdefinition durch pattern matching > not :: Bool -> Bool > not True = False > not False = True Wie jeder Haskell-Typ hat Bool ausser True und False noch den Wert undefined. Da undefined auf keines der beiden pattern passt, ist < not undefined < = {pattern exhaustion} < undefined Eine Funktion f mit | f undefined = undefined | nennt man "strict", andernfalls "non-strict". (Übung: Kann man eine non-strict function |not'| definieren, die sich auf True und False wie |not| verhält? > infixr 3 && > (&&) :: Bool -> Bool -> Bool > False && x = False > True && x = x > > infixr 3 || > (||) :: Bool -> Bool -> Bool > False || x = x > True || x = True Benutzen wieder pattern matching auf dem linken Argument. && ist strict im linken, non-strict im rechten Argument undefined && False = {pattern exhaustion} undefined False && undefined = {Def. &&} False insbesondere also auch nicht wirklich kommutativ! Übung: Kann man && und || auch strict in beiden Argumenten definieren? Übung: Vervollständigen Sie die folgende Definition der Implikation: > implies :: Bool -> Bool -> Bool > True `implies` x = undefined > False `implies` _ = undefined Was ist mit Assoziativität?