繁体   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