我想了解哈斯克爾的功能遞歸,但我有一些問題,與此功能,特別是與foldr
功能:哈斯克爾:遞歸在lambda函數
我宣佈一個data
形狀的這種方式:
type P = (Int, Int) -- point
type V = (Int, Int) -- vector
data Shape =
Line P P -- line characterized by two vertices
| Triangle P P P -- characterized by three triangle vertices
deriving (Eq, Show)
現在,給出的表單列表,我要提取具有更大的面積形狀
maxArea :: [Shape] -> Shape
maxArea list = maxArea_hlp list 0
maxArea_hlp :: [Shape] -> Int -> Shape
maxArea_hlp list areaMax = foldr (\shape currmax -> if ((area shape) > (area currmax)) then shape else (shape:list)) 0 list
area :: Shape -> Int
area (Line _ _) = 0
area (Triangle p1 p2 p3) = 0
--TODO
的錯誤是:
Couldn't match expected type Shape with actual type [Shape]
In the expression: (shape : list)
錯誤在於lambda函數的「其他」分支,但我不知道如何解決它。
你能幫助我嗎?
感謝所有
'currmax'應該是什麼類型?根據'foldr'的類型簽名('(a - > b - > b) - > b - > [a] - > b'),它應該是數字的(與'0'相同),但是您也調用'area',這表明它應該是'Shape'。這是你的錯誤。爲此使用'foldr'很尷尬。爲什麼不使用'maximumBy'? – Jubobs 2015-03-31 18:33:44
你在if和另一個分支中的[Shape]中的一個分支中返回了一個'Shape',它沒有進行類型檢查。你在這裏使用'foldr'而不是'Data.List.maximumBy'有什麼特別的理由嗎?你甚至沒有使用'areaMax',所以它可能只是'maximumBy(比較區域)','Data.Ord.comparing'。 – bheklilr 2015-03-31 18:35:03
我不能使用函數'maximumBy',因爲我只能使用高階函數;非常感謝,我現在會嘗試修復它。 – 2015-03-31 18:58:19