【发布时间】:2019-02-05 14:34:30
【问题描述】:
我试图找到一个列表的最大元素,其中元素是我自己创建的数据类型,使用折叠而不是递归进行。但是我最终得到一个错误“无法匹配类型”。由于我对 haskell 相当陌生,我无法看到问题并希望知道如何正确应用 foldr 功能。
我获取最大元素的尝试如下所示:
--(foldr比较(头列表)(尾列表))
不会编译。
我已经包含了 Eq 和 Ord 的数据类型及其实例,我还包含了比较函数。
-- Car data type
data Car = Car {registration :: String,
hour :: Integer,
minute :: Integer,
tupleForm :: PTime
}
-- Equality comparison between Car data types
-- reqiures equality by registration number, hours and minutes
instance Eq Car where
(Car r1 h1 m1 _) == (Car r2 h2 m2 _) = (r1 == r2) && (((h1*60)+m1) ==
((h2*60)+m2))
-- Order comparison between Car data types
-- Compares time of two Cars , hours and minutes
instance Ord Car where
compare (Car _ h1 m1 _) (Car _ h2 m2 _) = compare ((h1*60)+m1)
((h2*60)+m2)
-- Returns the larger Car
comparison :: (Car,Car) -> Car
comparison(car1,car2) = if(car1 > car2) then car1 else car2
折叠Car列表后我的预期结果是获得“最大的汽车”,这基本上是指时间最长的汽车。但是由于类型错误,我最终会出现编译错误。
【问题讨论】:
-
一旦你将一个类型设为
Ord的实例,就像你在这里一样,你会“免费”获得一个maximum函数。所以你不需要实现你自己的。 (如果你想练习,你可能应该使用foldr1而不仅仅是foldr,因为找到一个空列表的最大值没有多大意义)。 -
没想到最大功能,多好啊!我将使用它而不是折叠,但我将把这个问题留给未来的参考,以供将来参考如何正确折叠这样的东西,看看我是如何无法弄清楚什么时候出错了。非常感谢@RobinZigmond!