【问题标题】:Add a new value in a list of data in Haskell在 Haskell 的数据列表中添加一个新值
【发布时间】:2021-04-15 01:02:05
【问题描述】:

我有包含记录的数据,我想用所有作者的新销售额数据更新列表。这将增加 Sales 中列表的长度,以便每位作者售出的图书数量变为去年的数字,依此类推。

data T = T { Author  :: String
           , Sales :: [Int]
           , Year :: Int}
    deriving Show

我的尝试

addNewValues :: [data] -> [Int] -> [data]
addNewValues  (m:ms) (x:xs) = let (author, sales, year)  addNewValues ms xs

我意识到这是不正确和不完整的,但作为初学者,我不知道从这里开始。

【问题讨论】:

  • 你能举一个具体的例子来说明你想要 addNewValues 的输入和输出吗?
  • 例如,如果我有一个值,例如 [("Jennifer Aeker", 2948, 2009)] 我会给新的销售值 5385,addNewValues [("Jennifer Aeker", 5385, 2009)]然后在新唱片中,我将拥有新旧唱片 [("Jennifer Aeker", 5385, 2948, 2009)]
  • 在您的问题中,您将[Int] 作为第二个和第三个字段的类型,但在您的评论中,您只有一个整数而不是列表。 (在您对评论的最新编辑中,您有 3 个数字,但不清楚每个列表中应该包含哪个数字。)
  • 抱歉,这只是一个例子,所以我没有在评论中添加更多值。
  • 每条记录不是只有一年,而不是年份列表吗?那你为什么把它设为[Int]

标签: list haskell


【解决方案1】:

在 Haskell 中,变量以小写字母开头,构造函数以大写字母开头。 AuthorSalesYear是变量,所以先把它们改成小写字母开头:

data T = T { author  :: String
           , sales :: [Int]
           , year :: Int}
    deriving Show

另外,data 是定义类型的关键字,而不是类型本身,因此您希望在函数的类型签名中使用 T 而不是 data

addNewValues :: [T] -> [Int] -> [T]

另一个关键点是自定义数据类型不是元组,因此您不能对它们使用元组语法。使用记录更新语法如下所示:

addNewValues  (m:ms) (x:xs) = m{ sales = x:sales m }:addNewValues ms xs

您需要的最后一件事是终止递归,因此您不会在列表末尾收到错误:

addNewValues _ _ = []

下面是一个使用它的例子:

Prelude> addNewValues [T "Jennifer Aeker" [2948] 2009] [5385]
[T {author = "Jennifer Aeker", sales = [5385,2948], year = 2009}]

或者,如果您确实想使用元组而不是自定义类型,则可以将 type 和 cons case 替换为以下几行:

type T = (String, [Int], Int)
addNewValues  (m:ms) (x:xs) = let (author, sales, year) = m in (author, x:sales, year):addNewValues ms xs

如果你还在学习 Haskell,接下来你应该研究的是 zipWith 函数,它可以让你把这一切变得更整洁。

【讨论】:

  • 非常感谢。如果我要使用这样的自定义数据类型:type Author = String type = Sales [int] type Year = Int。输入 Record = (Author, Sales, Year) ,我还能像你一样在我的代码中使用 Sales 吗?因为当我尝试输入“销售”时出现解析错误
  • @buzzyso type 定义别名,而不是自定义数据类型。 data 定义自定义数据类型。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-13
  • 2021-03-30
相关资源
最近更新 更多