Links und Funktionen
Sprachumschaltung

Navigationspfad
Sie sind hier: Startseite / Lehre / SS 2018 / Programmierung und Modellierung / ProMo Material / Code 11.06.18


Inhaltsbereich

Code 11.06.18

Drei unabhängige Beispiele zum Thema Typsysteme/Typinferenz

Haskell source code icon powerlist.hs — Haskell source code, 1 KB (1989 bytes)

Dateiinhalt

{-# LANGUAGE NoMonomorphismRestriction #-} -- Nur für Beispiel 1
{-# LANGUAGE RankNTypes #-}                -- Nur für Beispiel 2


-- Code aus Vorlesung "Programmierung & Modellierung" 11.06.2018
-- Dr Steffen Jost, LMU München
--
-- Datei enthält drei unabhängige Beispiele zum Thema Typsysteme/Typinferenz
---


---- 1 Prinzipale Typen:
import Data.List

-- Diese Version geht nur mit NoMonomorphismRestriction:
lenTwo :: (Num a, Num b) => [c] -> (a,b)
lenTwo xs = (len,len)
  where
    len  = Data.List.genericLength xs

-- Versionen ohne NoMonomorphismRestriction:
lenTwo1 :: (Num a, Num b) => [c] -> (a,b)
lenTwo1 xs = (len,len')
  where
    len  = Data.List.genericLength xs
    len' = Data.List.genericLength xs

lenTwo2 :: Num a => [c] -> (a,a)
lenTwo2 xs = (len,len) -- hier nur eine Rekursion über die Liste
  where
    len  = Data.List.genericLength xs



------ 2 Beispiel ohne Prinzipale Typen mit RankNTypes

-- Beide Typsignaturen okay, keine kann inferiert werden:

foo :: (forall a . a -> a) -> (b -> b)
-- foo :: (forall a . a) -> b
foo x = x x -- einfache, aber sinnlose Funktionsdefinition zur Demonstration

-- Dies ist nicht etwa eine Unzulänglichkeit von GHC,
-- sondern bekanntermaßen Unentscheidbar!!!



------ 3 Beispiel Polymorphe Rekursion

data PowerList a = Zero a | Succ (PowerList (a,a))
  deriving (Eq, Show)

pl1 = Succ $ Zero ('a','b')
pl2 = Succ $ Succ $ Succ $ Zero (((1,2),(3,4)),((5,6),(7,8)))
pl3 = Succ $ Succ $ Succ $ Succ $ Zero ((((0,1),(2,3)),((4,5),(6,7))),(((8,9),(10,11)),((12,13),(14,15))))

plLength :: PowerList a -> Int -- GHC kann Typ nicht inferieren!
plLength (Zero _ ) = 1
plLength (Succ pl) = 2 * plLength pl


plAt :: Int -> PowerList a -> a
plAt 0 (Zero x) = x
plAt n l@(Succ xx)
  | even  n   = fst $ plAt (n `div` 2) xx
  | otherwise = snd $ plAt (n `div` 2) xx
plAt x l = error $ "plAt: invalid index " ++ show x


-------


main = putStrLn "Hello!" -- nur damit es mit ghc kompiliert; aber hier noch nutzlos sonst.

Artikelaktionen


Funktionsleiste