-- (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)上,我们将得到,作为相邻点之间的总和。
答案 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
函数p1
和p2
完全没有用,因此我将其删除;它们不仅是相同的,而且都是p1, p2 :: (a,b) -> (a,b)
类型,即p1 = p2 = id
。