От http://learnyouahaskell.com/making-our-own-types-and-typeclassesИзбежание примитивной одержимости в Haskell
data Person = Person { name :: String
, age :: Int
} deriving (Show)
В реальном приложении, используя примитивы, такие как строки и Int для имени и возраста будут constitue примитивной одержимости, код запаха. (Очевидно, также дата родился предпочтительнее Int возраста, но давайте игнорировать это) Вместо этого, один предпочел бы что-то вроде
newtype Person = Person { name :: Name
, age :: Age
} deriving (Show)
В языке OO это будет выглядеть как
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);
}
}
Но как то же самое достигнутый в идиоматической, лучшей практике Haskell?
не могли бы вы рассказать о различиях между тем же, использовать тип из Data.Word или неэффективное предложение? Может быть, Liquid Haskell? – fred
Предоставление умного конструктора для 'Age' - это некоторая работа; вам нужно создать новый тип и две функции; но он эффективен и прост в использовании. 'Data.Word' - это просто целое число без знака, например' uint' в C#. На самом деле мало пользы от использования представления 'Zero' /' PlusOne'. Я очень мало знаю о Liquid Haskell, но в F *, который также имеет типы уточнения, вы должны написать 'type Age = i: int {i> = 0}', и проверка типа отклонит вашу программу, если она не равна 100 % уверен, что возраст, который вы проходите, больше или равен нулю. – rightfold
Я знаю, что это просто глупый пример, но многие люди делают ошибку реального мира, устанавливая ограничение длины для имен, которые слишком коротки, чтобы обрабатывать все имена, которые есть на самом деле. Некоторые ограничения разумны, чтобы избежать DOS-атак и т. Д., Но я был бы очень подозрительно относиться к ограничению длины имени под 256 символами или около того, и если бы я разрабатывал систему, я бы хотел обратиться к эксперту, чтобы убедиться, что этого достаточно , – dfeuer