【问题标题】:Recursion over list inside list递归列表内的列表
【发布时间】:2021-04-30 01:14:39
【问题描述】:

我有一些这样的代码:

data Set = Set String [Int]
  deriving (Show, Read)
getArr :: Set -> [Int]
getArr (Set _ arr) = arr

我的目标是编写一个将值列表输入到元组中的函数。 例如: 数据 - "One" [1], "Two" [2], "Three" [3] 输出:"One" [0, 1], "Two" [1,2], "Three" [3,3],输入为 [0, 1, 3]

我对此的一般方法是递归地遍历数据,同时使用 : 将其添加到第一个索引中。

我试图做类似的事情:

addToSet :: [Set] -> [Int] -> [Set]
addToSet [] [] = []
addToSet (x:xs) (y:ys) = (getArr x : y) ++ addToSet xs

但我收到一条错误消息:

Couldn't match type ‘[Int]’ with ‘Set’
  Expected type: [Set]
    Actual type: [[Int]]```

【问题讨论】:

  • 这里发生了很多事情 - 首先 get Arr x : y 将导致 Int-list(getArr 的结果)被添加到 [Int]`(y) - 然后结果(它应该是什么)与[Int] -> [Set] 连接(你只将xs 部分应用到addToSet)......另外:你能做一个更好的例子(输入到addToSet 和预期输出)?您上半场的例子似乎与下半场完全无关

标签: haskell


【解决方案1】:

考虑辅助函数

updateSet :: Set -> Int -> Set
updateSet (Set s xs) y = Set s (y:xs)

这只是将单个值添加到给定集合中:

>>> updateSet (Set "One" [1]) 0
Set "One" [0,1]

那么addToSet 只是zipWith 的包装:

addToSet :: [Set] -> [Int] -> [Set]
addToSet = zipWith updateSet

updateSet 在第一个集合和第一个整数上调用,然后是第二个集合和第二个整数,依此类推,结果按顺序组合在一个列表中。


另一种思考方式是将(Set, Int) -> Int 类型的函数映射到将两个列表压缩在一起的结果:

updateSet' :: (Set, Int) -> Set
updateSet' (Set s xs, y) -> Set s (y:xs)

addToSet :: [Set] -> [Int] -> [Set]
addToSet ss is = map updateSet' (zip ss is)

注意updateSet' = uncurry updateSet

【讨论】:

  • 我理解您的解释并感谢它,但我尝试运行addToSet(sampleSet [0, 1, 3]),但出现错误
  • 括号用错了。电话只是addToSet sampleSet [0, 1, 3]
  • 具体来说,在函数调用中不使用括号,除非将子表达式定义为单个参数。函数调用本身只是函数及其参数由空格分隔。请注意foo x y两个 函数调用:foo x 返回一个函数,然后将其应用于y。非正式地,您可以将其视为对 foo 的一次调用,带有两个参数。
  • 我有时想知道我们是否对新的 Haskellers 造成了伤害,因为“功能应用程序是并置”这一行。也许像其他语言一样教他们“所有函数都接受一个参数”和“使用括号进行应用”会更好。所以foo(x)(y)(z) 因为我们将foo 应用于x,然后将foo(x) 应用于y,然后将foo(x)(y) 应用于z。然后在以后的某个日期,我们可以告诉他们,为了方便起见,您可以在单个标记或其他东西周围放置括号。 ...但我敢肯定会有一些新的混乱,然后是当前的方式没有。叹息。
  • Haskell 只是使用更高级别的抽象。 mapzip 基本上通过表示非常常用的模式来“隐藏”你的递归。这类似于您编写a + b 的方式,而不是自己迭代ab 的位并使用AND 和XOR 来实现半加器。
猜你喜欢
  • 2014-03-02
  • 1970-01-01
  • 2016-10-21
  • 1970-01-01
  • 2017-06-24
  • 1970-01-01
  • 1970-01-01
  • 2021-09-15
  • 2016-09-07
相关资源
最近更新 更多