Ошибки, которые выдает GHC, безусловно, полезны. Давайте пройдемся по ним один за другим.
Во-первых, я не получаю никакой ошибки синтаксического анализа, пока я удаляю ложные отступы в начале. Вместо этого я получаю эту ошибку:
blockquote>main.hs:11:17: error: Not in scope: type constructor or class ‘Punkt..’ No module named ‘Punkt’ is imported.
Глядя на соответствующую строку, я вижу, что вы написали
Punkt..
без причины. Это ничего не значит. Это должно быть простоPunkt
. здесь исправление с лучшим отступом.data Streckenzug = Streckenzug { streckenzug :: [Punkt] -- Correction here }
Когда я исправляю это, ошибки меняются. Давайте перейдем к следующему:
blockquote>main.hs:15:9: error: • Couldn't match expected type ‘Punkt’ with actual type ‘(Float, Float)’
Глядя на соответствующую строку, я вижу, что вы не соответствуете на
Punkt
, но на самом деле на(Float, Float)
с. Это тривиально исправить. Вот решение с лучшим отступом:distanz :: Punkt -> Punkt -> Float distanz pkt1 pkt2 = sqrt (x' * x' + y' * y') -- Correction here where x'= x pkt1 - x pkt2 y'= y pkt1 - y pkt2 -- Note the adjustment here.
Пожалуйста, поймите, что
Punkt
- это не просто кортеж чисел; он обрабатывается отдельно компилятором.К сожалению, я попытался бы исправить вашу функцию
laenge
, но я вообще не могу понять, что вы подразумеваете под ней - типы полностью нарушены, и ваше намерение неясно. Я бы порекомендовал учиться на вышеуказанных ошибках и повторить попытку.В целом, однако, работает следующий файл:
data Punkt = Punkt { x :: Float , y :: Float } data Streckenzug = Streckenzug { streckenzug :: [Punkt] } distanz :: Punkt -> Punkt -> Float distanz pkt1 pkt2 = sqrt (x' * x' + y' * y') where x'= x pkt1 - x pkt2 y'= y pkt1 - y pkt2
Функции
p1
иp2
совершенно бесполезны, и поэтому я удалил их; они не только идентичны, но и оба имеют типp1, p2 :: (a,b) -> (a,b)
, другими словамиp1 = p2 = id
.
Проверьте: Ссылка на Varchar
Короче говоря, нет большой разницы, если вы не превысите размер 255 в своем VARCHAR, который потребует еще один байт для префикса длины .
Длина указывает больше на ограничение данных, хранящихся в столбце, чем что-либо еще. Это по своей сути также ограничивает МАКСИМАЛЬНЫЙ размер хранилища для столбца. IMHO, длина должна иметь смысл с точки зрения данных. Если вы храните номер социального страхования, нет смысла устанавливать длину 128, даже если это ничего не стоит в хранилище, если все, что вы на самом деле храните, - это SSN.
Существует много веских причин для выбора значения, меньшего максимального значения, которые не связаны с производительностью. Установка размера помогает указать тип данных, которые вы храните, а также может выступать в качестве последней проверки достоверности.
Например, если вы храните почтовый индекс Великобритании, вам нужно всего 8 символов. Установка этого предела помогает прояснить тип данных, которые вы храните. Если вы выберете 255 символов, это только запутает дело.
Существует семантическое различие (и я считаю, что это единственное различие): если вы попытаетесь заполнить 30 непробельных символов в varchar (20), это приведет к ошибке, тогда как для varchar (255) это удастся. Так что это прежде всего дополнительное ограничение.
Хорошо, если вы хотите разрешить более крупную запись или ограничить размер записи, возможно.
Например, вы можете иметь first_name в качестве VARCHAR 20, но, возможно, street_address в качестве VARCHAR 50, поскольку 20 может не хватить места. В то же время вы можете контролировать, насколько большим может быть это значение.
Другими словами, вы установили потолок того, насколько большим может быть конкретное значение, теоретически, чтобы таблица (и, возможно, записи индекса / индекса) не становились слишком большими.
Вы можете просто использовать CHAR, который также имеет фиксированную ширину, но в отличие от VARCHAR, который может быть меньше, CHAR дополняет значения (хотя это обеспечивает более быстрый доступ к SQL.
С точки зрения производительности базы данных я не верю, что будет какая-то разница.
Тем не менее, я думаю, что большая часть решения о длине использования сводится к тому, что вы пытаетесь выполнить, и документированию системы для приема только тех данных, которые ей нужны.
Я не знаю о mySQL, но в SQL Server он позволяет вам определять такие поля, чтобы общее количество используемых байтов было больше, чем общее количество байтов, которые фактически могут быть сохранены в записи. Это плохо. Рано или поздно вы получите строку, в которой достигнут предел и вы не можете вставить данные.
Гораздо лучше проектировать структуру базы данных с учетом ограничений на размер строк.
Кроме того, да, вы не хотите, чтобы люди помещали 200 символов в поле, где максимальное значение должно быть 10. Если они это сделают, это почти всегда неверные данные.
Вы говорите, что я могу ограничить это на уровне приложения. Но данные не попадают в базу данных только из одного приложения. Иногда его используют несколько приложений, иногда данные импортируются, а иногда исправляются вручную из окна запроса (например, обновите все записи, чтобы добавить 10% к цене). Если какой-либо из этих других источников данных не знает о правилах, которые вы вводите в свое приложение, у вас будут плохие, бесполезные данные в вашей базе данных. Целостность данных должна быть обеспечена на уровне базы данных (что не мешает вам также проверять, прежде чем вы попытаетесь ввести данные), иначе у вас нет целостности. Кроме того, по моему опыту, люди, которые слишком ленивы при проектировании своей базы данных, часто также слишком ленивы, чтобы на самом деле вводить ограничения в приложение, и нет никакой проверки целостности данных.
У них есть слово для баз данных без целостность данных - бесполезно.
у вас будут плохие, бесполезные данные в вашей базе данных. Целостность данных должна быть обеспечена на уровне базы данных (что не мешает вам также проверять, прежде чем вы попытаетесь ввести данные), иначе у вас нет целостности. Кроме того, по моему опыту, люди, которые слишком ленивы при проектировании своей базы данных, часто также слишком ленивы, чтобы на самом деле вводить ограничения в приложение, и нет никакой проверки целостности данных.У них есть слово для баз данных без целостность данных - бесполезно.
у вас будут плохие, бесполезные данные в вашей базе данных. Целостность данных должна быть обеспечена на уровне базы данных (что не мешает вам также проверять, прежде чем вы попытаетесь ввести данные), иначе у вас нет целостности. Кроме того, по моему опыту, люди, которые слишком ленивы при проектировании своей базы данных, часто также слишком ленивы, чтобы на самом деле вводить ограничения в приложение, и нет никакой проверки целостности данных.У них есть слово для баз данных без целостность данных - бесполезно.