Haskell 2D указывает расстояние и длину

Это тоже смутило меня, потому что я исходил из фона C.

В C переменная - это место в памяти с определенным типом. Назначение переменной копирует данные в ячейку памяти переменной.

Но в Python переменные действуют скорее как указатели на объекты. Поэтому присвоение одной переменной другой не создает копию, она просто превращает это имя переменной в один и тот же объект.

-3
задан Andrey Tyukin 16 January 2019 в 20:18
поделиться

1 ответ

Ошибки, которые выдает 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.

0
ответ дан AJFarmar 16 January 2019 в 20:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: