【问题标题】:adding a constant to tuple list向元组列表添加一个常量
【发布时间】:2018-10-18 14:09:28
【问题描述】:

所以我有一个元组列表,并且想对每个元组列表做一个并将常量添加到列表中

类似的东西

convertingList :: (Int,Int)->[(Int,Int)] -> [(Int,Int)]
convertingList (a,b) list = [(x,y) | (c,d) <- list] where x = a + c   y = b + d

我得到错误 c 和 d 不在范围内,我该如何解决这个问题? 变量不在范围内:c :: Int 变量不在范围内:d :: Int

我可以使用更好的功能吗,也许是 map ? 谢谢帮忙

【问题讨论】:

  • 你想添加哪个常量?

标签: haskell functional-programming


【解决方案1】:

您的where 的范围列表理解之外。在列表理解之外 cd 确实没有定义。

但我认为你把这个问题弄得太复杂了。您可以简单地将添加内容放在列表理解的开头:

convertingList :: (Int,Int) -> [(Int,Int)] -> [(Int,Int)]
convertingList (a,b) list = [(a + c, b + d) | (c,d) <- list]

或者你可以使用let 表达式:

convertingList :: (Int,Int) -> [(Int,Int)] -> [(Int,Int)]
convertingList (a,b) list = [let x = a+c; y = b+d in (x, y) | (c,d) <- list]

或者像@M.Aroosi 所说,我们可以将lets(不带in!)移动到列表理解的正文部分:

convertingList :: (Int,Int) -> [(Int,Int)] -> [(Int,Int)]
convertingList (a,b) list = [ (x, y) | (c,d) <- list, let x = a+c, let y = b+d]

另一种选择是定义一个映射函数,将ab 添加到元素中,例如:

convertingList :: (Int,Int) -> [(Int,Int)] -> [(Int,Int)]
convertingList (a,b) = map f
    where f (c, d) = (a+c, b+d)

(***) :: Arrow a =&gt; a b c -&gt; a b' c' -&gt; a (b, b') (c, c'):

import Control.Arrow((***))

convertingList :: (Int,Int) -> [(Int,Int)] -> [(Int,Int)]
convertingList (a,b) = map ((***) (a+) (b+))

【讨论】:

  • 另一个选项是[(x, y) | (c,d) &lt;- list, let x = a+c, let y = b+d]
猜你喜欢
  • 2012-10-28
  • 2017-09-09
  • 2022-08-11
  • 2014-03-15
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多