我刚刚开始学习Haskell,并且对如何将评级添加到自定义数据类型感到困惑。
我使用的数据类型有一个名称,一年和一个元组(userName及其评级),它看起来像:
data Wine = Wine String Int [Rating] deriving (Eq,Ord,Show,Read)
type Rating = (String, Int)
我想允许用户从数据库中评定给定的葡萄酒,存储为[Wine],但无法弄清楚如何使用它。任何指针或建议将不胜感激!感谢。
答案 0 :(得分:4)
为什么不使用record syntax?
data Wine = Wine {
wineName :: String,
wineYear :: Int,
wineRatings :: [Rating]
}
rateWine :: Wine -> Rating -> Wine
rateWine wine rating = wine { wineRatings = rating : wineRatings wine }
答案 1 :(得分:0)
我希望这能解决你的问题:
addRating :: Wine -> Rating -> Wine
addRating (n, y, rs) r = (n, y, r:rs)
答案 2 :(得分:0)
除了为单个葡萄酒添加评级的问题(其他海报很好地解决了)之外,还有两个需要完成的任务:
findWineIndex :: String -> Int -> [Wine] -> Maybe Int
这样的函数 - 我正在使用Maybe Int作为结果,以便你有机会寻找Chateau Briand 2025,或类似的东西。replaceWineInList :: Int -> Wine -> [Wine] -> [Wine]
这样的函数,它采用索引,更新的葡萄酒和原始数据库,并返回更新的葡萄酒数据库。但是,明确地管理索引并不是最好的方法! (更不用说这是低效的,因为你将遍历列表两次,对Maybe
处理略显凌乱,我敢说,这是必要的方式:)
您还可以尝试定义一个函数updateFirstThat :: (a -> Bool) -> (a -> a) -> [a] -> [a]
,该函数使用谓词和更新函数,该函数将更新应用于满足谓词的第一个元素。示例用法为updateFirstThat (>3) (*2) [1..6]
,应评估为[1,2,3,8,5,6]
。
我希望你能用这些零碎的东西拼凑一个解决方案,否则只需要几个提示!