[英]Haskell: cannot construct the infinite type
我有一個元組列表(天:月),想查找天數最多的月份。
我做了一個函數,它接受我的元組列表和月份列表(或僅1個)以檢查並返回指定時期內一個月中的最大日期數
maxweekends x [] = 0
maxweekends x [n] = length (filter ((==n).snd) x)
maxweekends x (y:ys) = max (maxweekends x [y]) (maxweekends x ys)
然后,我編寫了一些簡單的函數來使用它,但是由於“無法構造無限類型”錯誤而無法對其進行編譯。 我已經花了幾個小時解決這個錯誤,但我只是不明白哪里出了問題。
func x [] = 0
func x (y:ys)
| maxweekends x y < maxweekends x ys = func x ys
| otherwise = y
從理論上講,它應該自我調用,直到沒有月份有更大的日期,然后才返回答案。
謝謝。
編輯: 這是錯誤的回溯
您無限類型的產生是因為您用xy
和x ys
調用maxweekends
。 由於maxweekends :: Eq b => [(a, b)] -> [b] -> Int
指定給定“ second”參數的類型為[b]
,因此第一個參數的類型為[(a, b)]
,這意味着x
應該同時為[(a, b)]
(對於第一次調用)和[(a, [b])]
(對於第二次調用),這是不可能的。
我認為最好首先進行重組 。 讓我們首先構造一個看起來像這樣的函數:
groupLength :: Eq b => Int -> b -> [(a, b)] -> Int
groupLength d _ [] = d
groupLength _ x ys = length (filter ((x==) . snd) ys)
這將從而對於給定的“月” x
獲得列表中的元素的數量與為“月”的元組的第二項。
現在我們可以生成一個“ argmax”,用於計算x
, fx
產生最大值的值:
argmax :: Ord b => (a -> b) -> [a] -> Maybe (a, b)
argmax _ [] = Nothing
argmax f (x:xs) = Just (go x (f x) xs)
where go x y [] = (x, y)
go x y (x2:xs) | y <= y2 = go x y xs
| otherwise = go x2 y2 xs
where y2 = f x2
因此,現在只需要結合groupLength
(這是maxweekends
與argmax
的抽象版本)(這或多或少是您的func
所需要的)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.