簡體   English   中英

Haskell:無法構造無限類型

[英]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

從理論上講,它應該自我調用,直到沒有月份有更大的日期,然后才返回答案。

謝謝。

編輯: 這是錯誤的回溯

您無限類型的產生是因為您用xyx 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”,用於計算xfx產生最大值的值:

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 (這是maxweekendsargmax的抽象版本)(這或多或少是您的func所需要的)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM