2016-04-03 72 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