在haskell中返回双打

时间:2016-04-03 15:21:48

标签: haskell

现在我要做的是写另一个函数,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 = []

1 个答案:

答案 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"

还有其他人。