现在我要做的是写另一个函数,triangle_areas(注意这里使用复数),它取一个双打列表,将每个连续的三个双打组视为三角形三边的长度,使用triangle_area计算其面积;处理完列表中的所有双打后,将所有计算区域作为双打列表返回。
到目前为止,这是我的代码。
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 = []
答案 0 :(得分:4)
使用模式匹配来获取输入的前三个元素,然后递归。如果您假设始终使用长度为3的倍数的列表调用triangle_areas
,那么这是最简单的。
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"
还有其他人。