www.jammni.de

Logo - Kleiner Drache
Login
Username:

Passwort:

Daten merken
Auto-Login
Registrieren
 
Online
niemand
 
Forumsuche
Suche nach:

Logo - DracheHaskell-Forum

IKT

Gepostet:
17.05.2012 08:54

data nutzen um Fehler Kompilierzeit abzufangen  
Hallo, ich habe hierzu eine Frage:

http://stackoverflow.com/questions/10626943/haskell-between-a-list-and-a-tuple/10627560#10627560

verglichen mit z.B.


data Vec = Vec Int [Int]

nil = Vec 0 []

infixr 5 <:>
x <:> (Vec n xs) = Vec (n+1) (x:xs)

add :: Vec -> Vec -> Vec
add (Vec n1 xs) (Vec n2 ys)
| n1 == n2 = Vec n1 (zipWith (+) xs ys)
| otherwise = error \\\"listenlänge nicht gleich\\\"

toList (Vec _ xs) = xs
main = print $ toList $ add (3 <:> 4 <:> 2 <:> nil) (10 <:> 12 <:> 0 <:> 4 <:> nil)


liegt der Vorteil darin, dass schon zur Kompilierzeit erkannt wird, dass die Typen nicht passen (Vec (S (S (S (S Z)))) / Vec (S (S (S Z))))) und deswegen dass Programm gar nicht erst kompiliert. Bei der anderen Möglichkeit kompiliert das Programm, weil die Typen Vec und Vec übereinstimmen. Das heißt es richtet sich nach den Typen, oder?

Nun die Frage die man vielleicht so offen gestellt nicht beantworten kann... es gibt ja öfter mal Stellen im Kode wo \\\"error = .. \\\" steht - kann / sollte man die dann vermeiden in dem man möglichst versucht, den Typ auf dem die Funktion arbeitet, so zu erweitern dass der Fehler schon zur Kompilierzeit abgefangen wird?
Zum Seitenanfang    
 
Landei

Gepostet:
18.05.2012 08:50

   
Das ist immer ein Kompromiss: Der Typ Vec mit Type-Level-Programming erkauft sich seine Sicherheit mit längerer Kompilierzeit (oder eventuell sogar Stacküberlauf im Compiler) und Unbequemlichkeiten bei der Programmierung (man kann z.B. keine allgemeine Funktion schreiben, die eine Liste in einen Vec transformiert, und eine Methode, um zwei Vektoren aneinanderzuhängen, ist wirklich kompliziert). Für kurze Vektoren ist der Code sicher nicht schlecht, insbesondere weil man den Typ mit entsprechenden type-Deklarationen und spezialisierten Methoden bequemer machen kann, aber für längere Vektoren sollte man lieber die Laufzeitfehler in Kauf nehmen. Oft lassen sich bestimmte Eigenschaften auch mit anderen Mitteln sicherstellen (man denke an NonEmpty für garantiert nicht-leere Listen, oder Stream für garantiert unendliche Listen).

Die Compiler vernünftiger Sprachen sind schon heute turing-komplett ( http://michid.wordpress.com/2010/01/29/scala-type-level-encoding-of-the-ski-calculus/ - lässt sich auch auf Haskell übertragen), aber Type-Level-Programming ist eben noch sehr unhandlich und schwer zugänglich. Es wird intensiv auf diesem Gebiet geforscht, und ich denke, perspektivisch wird dieses Konzept immer mehr Raum einnehmen.
Zum Seitenanfang    
 
IKT

Gepostet:
20.05.2012 17:11

   
Danke für die Antwort :)
Zum Seitenanfang    
 
Landei

Gepostet:
05.08.2012 13:41

   
Derartige Programmierung wird übrigens in Zukunft einfacher:

http://www.haskell.org/pipermail/haskell-cafe/2010-October/084852.html
Zum Seitenanfang