Haskell 2D указывает расстояние и длину - PullRequest
0 голосов
/ 16 января 2019
-- (edit)
-- Punkt = Point
-- Streckenzug = Polygonal chain
-- distanz = distance
-- laenge = length
-- (/edit)

data Punkt = Punkt 
  { x :: Float
  , y :: Float 
  }

p1 (x1, x2) =(x1,x2)
p2 (y1, y2) =(y1,y2)


data Streckenzug = Streckenzug {
streckenzug :: [Punkt..]
}  

distanz :: Punkt -> Punkt -> Float
distanz (x1,y1) (x2,y2) = sqrt (x' * x' + y' * y')
 where
 x'= x1-x2
 y'= y1-y2


laenge :: Streckenzug -> Float
laenge (x:xs) = if length Streckenzug < 2
                    then Streckenzug
                    else sum([distanz p1 p2 | (p1,p2) <- xs ]  )

Может кто-нибудь сказать мне, почему я получаю ошибку разбора на Streckenzug?Ошибки, которые выдает Хаскелл, на самом деле не помогают.

У нас есть данные Punkt, которые должны быть точкой в ​​двумерной системе координат, и данные Streckenzug, которые представляют собой список точек, которые позже будут описаны в функциях distanz и laenge.(длина) дает нам как сумму между соседними точками.

1 Ответ

0 голосов
/ 16 января 2019

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...