Von http://learnyouahaskell.com/making-our-own-types-and-typeclassesVermeiden von primitiver Besessenheit in Haskell
data Person = Person { name :: String
, age :: Int
} deriving (Show)
In einer realen Anwendung unter Verwendung von Primitiven wie String und Int für Namen und das Alter würden primitive Besessenheit Constitué, einen Code Geruch. (Auch offensichtlich geboren Datum ist vorzuziehen, Alter Int aber lassen wir das ignorieren) Stattdessen würde man so etwas wie
newtype Person = Person { name :: Name
, age :: Age
} deriving (Show)
In einer OO-Sprache bevorzugen diese etwas aussehen würde wie
class Person {
Name name;
Age age;
Person(Name name, Age age){
if (name == null || age == null)
throw IllegalArgumentException();
this.name = name;
this.age = age;
}
}
class Name extends String {
Name(String name){
if (name == null || name.isEmpty() || name.length() > 100)
throw IllegalArgumentException();
super(name);
}
}
class Age extends Integer {
Age(Integer age){
if (age == null || age < 0)
throw IllegalArgumentException();
super(age);
}
}
Aber wie ist das gleiche in idiomatischen, Best Practice Haskell erreicht?
Würde es Ihnen etwas ausmachen, auf die Unterschiede zwischen der gleichen Sache, Typ aus Data.Word oder der ineffiziente Vorschlag zu erarbeiten? Vielleicht auch Liquid Haskell? – fred
Einen intelligenten Konstruktor für 'Age' freizulegen ist etwas Arbeit; Sie müssen einen neuen Typ und zwei Funktionen erstellen. aber es ist effizient und einfach zu bedienen. 'Data.Word' ist nur eine vorzeichenlose Ganzzahl, wie' uint' in C#. Es hat wenig Vorteile, die "Zero"/"PlusOne" Darstellung wirklich zu verwenden. Ich weiß sehr wenig über Liquid Haskell, aber in F *, das auch Verfeinerungs-Typen enthält, würden Sie 'type Age = i: int {i> = 0}' schreiben und der Typ-Checker wird Ihr Programm ablehnen, wenn es nicht 100 ist % sicher, dass das Alter, das du passierst, größer oder gleich null ist. – rightfold
Ich weiß, dass dies nur ein dummes Beispiel ist, aber viele Menschen machen den Fehler der realen Welt, eine Länge für Namen festzulegen, die zu kurz ist, um alle Namen zu verarbeiten, die die Leute tatsächlich haben. Einige Grenzen sind vernünftig, um DOS-Angriffe und dergleichen zu vermeiden, aber ich wäre sehr misstrauisch gegenüber einer Namenslänge von unter 256 Zeichen oder so, und wenn ich das System entwerfe, würde ich einen Experten konsultieren wollen, um sicherzustellen, dass es genug war . – dfeuer