2016-11-06 103 views
1

我想要查找连续元素之间线段长度的总和。如何检查是否只有一个点并返回0.0作为输出。我还得到当我执行上面的代码时出现缩进错误。haskell中线段长度的总和

lengthSum :: Floating a => [(a, a)] -> a 
lengthSum pts = zipWith (sqrt (x'*x' + y'*y')) pts $ tail pts 
    where 
     x' = fst(pts) - fst(head(tail(pts))) 
     y' = snd(pts) - snd(head(tail(pts))) 

Input: lengthSum [(0, 0)] 
Expected Output: 0.0 
Input: lengthSum [(0, 0), (0, 1), (3, 5)] 
Expected Output: 7.0 

请谁能帮助我,我在Haskell

+0

我复制,粘贴和加载代码时不会出现缩进错误。这几乎总是表明你在混合空格和制表符。如果确实如此,则用空格替换代码中的所有选项卡。 – duplode

回答

1

你忘了实际添加了压缩列表新手; sum将自动处理空列表。如果pts只有一个项目,则zipWith将返回空列表,因为tail pts将为空。但是,您需要分别处理空的输入。 (我已经定义了一个辅助函数,使用模式匹配来简化代码)。

lengthSum :: Floating a => [(a,a)] -> a 
lengthSum [] = 0 
lengthSum pts = sum $ zipWith distance pts (tail pts) 
    where distance (x1,y1) (x2,y2) = sqrt ((x1-x2)^2 + (y1-y2)^2) 
+0

非常感谢,真的很有帮助:) –