Ошибки, которые выдает GHC, безусловно, полезны. Давайте рассмотрим их один за другим.
Во-первых, я не получаю никакой ошибки синтаксического анализа, пока я удаляю ложные отступы в начале. Вместо этого я получаю эту ошибку:
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
}
Когда я исправляю это, ошибки меняются. Давайте перейдем к следующему:
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
.