2016-04-03 82 views
1

现在我想要做的是编写另一个函数triangle_areas(注意在这里使用复数形式),该函数采用双精度列表,将每个连续的三个双精度组视为三边的长度的三角形,使用triangle_area来计算其面积;并且在处理完列表中的所有双打后,将所有计算出的区域作为双打列表返回。在haskell中返回双精度

这是我的代码到目前为止。

triangle_area :: Double -> Double -> Double -> Double 
triangle_area a b c = sqrt (s * (s - a) * (s - b) * (s - c)) 
    where s = (a + b + c)/2.0 

triangle_areas :: [Double] -> [Double] 
triangle_areas xs = [] 
+4

[欢迎使用StackOverflow](http://stackoverflow.com/help/asking)。现在你有问题了吗? – crockeea

+0

使用模式 - 取决于你想要的'triangle_areas(x:y:z:ds)'或者'triangle_areas(x:ds @(y:z:_))' – Carsten

+0

可能需要检查三角形不等式满足双方也是如此。 – karakfa

回答

4

使用模式匹配来获取输入的前三个元素,然后递归。如果您认为triangle_areas总是调用它的长度是3

triangle_areas :: [Double] -> [Double] 
triangle_areas [] = [] 
triangle_areas (a:b:c:xs) = triangle_area a b c : triangle_areas xs 

多对于一个额外的元素或两个列表,有很多的选项列表这是最简单的。一个是简单地忽略它们。

-- Case 3 
triangle_areas _ = [] 

另一种方法是简单的返回一个错误

-- Case 3 
triangle_areas _ = error "Incomplete final set" 

另一个是返回一个值Either

triangle_areas :: [Double] -> Either String [Double] 
triangle_areas [] = Right [] 
triangle_areas (a:b:c:xs) = Right $ triangle_area a b c : triangle_areas xs 
triangle_areas _ = Left "Incomplete final set" 

而且还有其他的。

+0

'triangle_area'不能像这样连接(它不是一个列表)。此外,这不能模式匹配长度为1和2的列表。 – jakubdaniel

+0

我特别说我假设输入列表的长度是3的倍数。处理其他列表的方法很多:忽略它们,如在答案中,提高一个例外,返回一个'或者一个[Double]'值给某个合适的类型'a'等。 – chepner

+0

用户可以选择一种方式来处理异常;我认为这超出了这个问题的范围。 – chepner