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