【问题标题】:Create an array of all possible variations of a triple in Haskell在 Haskell 中创建一个包含三元组所有可能变体的数组
【发布时间】:2020-09-17 12:31:02
【问题描述】:

我是 Haskell 的新手,我正在尝试创建一个接受三元组并返回三元组数组的函数,如下所示:

tripleVariations 1 (0,0,0)
=> [(1,0,0), (0,1,0), (0,0,1)]

我了解如何使用模式匹配匹配三元组中的特定值,我什至创建了一个自定义函数,将函数映射到三元组,但我不明白如何替换三元组的一个值,添加到数组,then 继续到三元组中的下一个值。我发现我倾向于根据命令式范式过多地尝试解决这些问题,这正是我试图避免的。欢迎任何帮助,谢谢!

【问题讨论】:

  • 你真的可以写吗? tripleVariations w (x,y,z) = [(w,y,z), (x,w,z), (x,y,w)]?
  • 解决方案的简单程度让我大吃一惊,非常感谢您!我只是想知道这是否不是太多“硬编码”的事情,或者这在功能范式中是否很正常?再次感谢!
  • 不,我认为“函数式编程中的正常”是制作一个可以在任何大小的元组上工作的函数。但是为什么要麻烦呢?
  • 不要为了抽象而抽象;抽象如果它使您的代码更简单。
  • 已经将此发布到已发布的答案中,但是:我假设我简化了我试图解决的问题,使其仍可用于最终解决方案,但现在我担心我确实需要更多的债务信息:我实际上需要能够在将最终三元组添加到数组时检查一个条件,因此,即仅在初始值为 0 时替换会导致:tripleVariations 1 (0,0,2)=> [(1,0,2), (0,1,2)]跨度>

标签: haskell


【解决方案1】:

当然你可以写它:

tripleVariations w (x,y,z) = [(w,y,z), (x,w,z), (x,y,w)]

如果您希望它与 任何 大小的元组一起使用,它会更复杂......但您不这样做,那么为什么要浪费精力呢?

根据Haskell: how to map a tuple? 没有办法遍历一个元组,因为元组可以有不同的类型。例如,迭代 (Int, String, Char) 类型是没有意义的。如果您想编写与每个部分都具有相同类型的元组一起使用的代码,那么您应该使用列表而不是元组。

【讨论】:

  • 我假设我简化了我试图解决的问题,使其仍然可用于最终解决方案,但现在我担心我确实需要更多的债务信息:我实际上需要能够在将最终三元组添加到数组时检查一个条件,因此,即仅在初始值为 0 时替换会导致:tripleVariations 1 (0,0,2)=> [(1,0,2), (0,1,2)]
  • @ovda96 已更新。我怀疑不简单地写出整个代码是不可能的,因为你不能迭代元组。 (好吧,您可以编写自己的函数来迭代元组)
  • @ovda96 构建 0 或 1 长度列表的标准技巧是使用理解语法。例如,如果用于检查是否应替换特定位置的谓词命名为p,则可以写为[(w,y,z) | p x] ++ [(x,w,z) | p y] ++ [(x,y,w) | p z]
  • 感谢@DanielWagner!但是,我最终试图将其调整为列表,因此我将发布一个新问题:)。
猜你喜欢
  • 2022-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多