Haskell 2D点的距离和长度

时间:2019-01-16 19:16:52

标签: haskell functional-programming

-- (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上遇到了解析错误吗? Haskell提出的错误并没有真正帮助。

我们有数据Punkt,它应该是二维坐标系中的一个点 和数据Streckenzug,这是一个点列表 稍后在函数distanz和laenge(length)上,我们将得到,作为相邻点之间的总和。

1 个答案:

答案 0 :(得分:2)

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

函数p1p2完全没有用,因此我将其删除;它们不仅是相同的,而且都是p1, p2 :: (a,b) -> (a,b)类型,即p1 = p2 = id