我試圖找到這給了我下面的錯誤元素的總和最小:爲什麼我得到一個無法推斷(Ord a)錯誤?
shortest :: (Num a) => [[a]] -> [a]
shortest [] = []
shortest (x:xs) = if sum x < sum (shortest xs) then x else shortest xs
名單:
Could not deduce (Ord a) arising from a use of `<' from the context (Eq a) bound by the type signature for shortest :: Eq a => [[a]] -> [a] at code.hs:(8,1)-(9,71) Possible fix: add (Ord a) to the context of the type signature for shortest :: Eq a => [[a]] -> [a] In the expression: sum x < sum (shortest xs) In the expression: if sum x < sum (shortest xs) then x else shortest xs In an equation for `shortest': shortest (x : xs) = if sum x < sum (shortest xs) then x else shortest xs
爲什麼沒有函數類型檢測?
「最短」並不是真正的正確名稱,是嗎? - 考慮在'Data.List'和'Data.Function'中使用'minimumBy(比較'\ sum)''的高階函數。 – leftaroundabout
要理解這個問題,重要的是要知道並非所有數字都可以訂購。例如,考慮像「1 + 2i」這樣的複數;沒有規範它們的規範方法。 – dflemstr
@leftaroundabout已經提出了一個使用庫函數的解決方案;但是如果你仍然想從頭開始寫作練習,除了解決類型簽名問題之外,還需要考慮'最短'[]'的值應該是什麼,換句話說,是什麼應該是遞歸的基礎(提示:通常不會爲空列表定義「最小」和「最大」)。 –