在Haskell中实现一个非常简单的“葡萄酒评级系统”

时间:2010-05-08 15:59:27

标签: haskell list tuples

我刚刚开始学习Haskell,并且对如何将评级添加到自定义数据类型感到困惑。

我使用的数据类型有一个名称,一年和一个元组(userName及其评级),它看起来像:

data Wine = Wine String Int [Rating] deriving (Eq,Ord,Show,Read)
type Rating = (String, Int)

我想允许用户从数据库中评定给定的葡萄酒,存储为[Wine],但无法弄清楚如何使用它。任何指针或建议将不胜感激!感谢。

3 个答案:

答案 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)

除了为单个葡萄酒添加评级的问题(其他海报很好地解决了)之外,还有两个需要完成的任务:

  1. 找到需要评级的葡萄酒。你不是100%清楚葡萄酒是如何被识别的,但我想这将是名字和年份。所以你需要创建一个像findWineIndex :: String -> Int -> [Wine] -> Maybe Int这样的函数 - 我正在使用Maybe Int作为结果,以便你有机会寻找Chateau Briand 2025,或类似的东西。
  2. 通过数据库中的更新替换“旧”葡萄酒。这将是一个像replaceWineInList :: Int -> Wine -> [Wine] -> [Wine]这样的函数,它采用索引,更新的葡萄酒和原始数据库,并返回更新的葡萄酒数据库。
  3. 但是,明确地管理索引并不是最好的方法! (更不用说这是低效的,因为你将遍历列表两次,对Maybe处理略显凌乱,我敢说,这是必要的方式:)

    您还可以尝试定义一个函数updateFirstThat :: (a -> Bool) -> (a -> a) -> [a] -> [a],该函数使用谓词和更新函数,该函数将更新应用于满足谓词的第一个元素。示例用法为updateFirstThat (>3) (*2) [1..6],应评估为[1,2,3,8,5,6]

    我希望你能用这些零碎的东西拼凑一个解决方案,否则只需要几个提示!