Это тоже смутило меня, потому что я исходил из фона C.
В C переменная - это место в памяти с определенным типом. Назначение переменной копирует данные в ячейку памяти переменной.
Но в Python переменные действуют скорее как указатели на объекты. Поэтому присвоение одной переменной другой не создает копию, она просто превращает это имя переменной в один и тот же объект.
Ошибки, которые выдает 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
.