【问题标题】:Implementing a very simple 'Wine Rating System' in Haskell在 Haskell 中实现一个非常简单的“葡萄酒评级系统”
【发布时间】:2010-05-08 15:59:27
【问题描述】:

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

我使用的数据类型有一个名字、一个年份和一个元组(用户名和他们的等级),它看起来像:

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

我想让用户对数据库中的给定葡萄酒进行评分,该数据库存储为 [Wine],但不知道如何对其进行评分。任何指示或建议将不胜感激!谢谢。

【问题讨论】:

    标签: haskell list tuples


    【解决方案1】:

    为什么不使用record syntax

    data Wine = Wine { 
      wineName :: String,
      wineYear :: Int,
      wineRatings :: [Rating]
    }
    
    rateWine :: Wine -> Rating -> Wine
    rateWine wine rating = wine { wineRatings = rating : wineRatings wine }
    

    【讨论】:

      【解决方案2】:

      我希望这能解决你的问题:

      addRating :: Wine -> Rating -> Wine
      addRating (n, y, rs) r = (n, y, r:rs)
      

      【讨论】:

        【解决方案3】:

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

        1. 找到需要评级的葡萄酒。你不是 100% 清楚葡萄酒是如何被识别的,但我想这将是按名称和年份来确定的。因此,您需要创建一个类似 findWineIndex :: String -> Int -> [Wine] -> Maybe Int 的函数 - 我使用 Maybe Int 作为结果,以便您可能正在寻找白里安城堡 2025 或类似的东西。
        2. 用数据库中的更新替换“旧”酒。这将是一个类似replaceWineInList :: Int -> Wine -> [Wine] -> [Wine] 的函数,它接受一个索引、一个更新的葡萄酒和原始数据库,并返回更新的葡萄酒数据库。

        但是,显式管理索引并不是最好的方法! (更不用说效率低下,因为您将遍历列表两次,Maybe 处理有点混乱,我敢说,命令式的方式:)

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

        希望你能将这些点点滴滴拼凑出一个解决方案,否则就请多指教!

        【讨论】:

          猜你喜欢
          • 2011-06-10
          • 2017-05-01
          • 2010-12-19
          • 2012-05-04
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-01-27
          • 1970-01-01
          相关资源
          最近更新 更多