【问题标题】:Using Variables inside Functions在函数中使用变量
【发布时间】:2023-03-29 10:01:02
【问题描述】:

假设我有一个名为“Coord”的数据类型,其定义如下:

type Coord a = [(Int, Int)]

我想创建一个“坐标”类型的变量以在下面的函数中使用。该函数接收一个 Coord 类型的变量,并将列表中每个项目的 x 坐标乘以 2。然后将这些新坐标中的每一个存储在一个 NEW Coord 变量中;我不确定如何创建/声明/使用这个我打算返回的新变量。

foo :: (Eq a) => Coord a -> Coord a

【问题讨论】:

  • 你是如何创建你的第一个坐标变量的?
  • 不应该是type Coord a = [(a, a)]吗?或newtype Coord a = Coord [(a, a)].
  • @DarrelGulseth: 但是我不明白为什么(a)你仍然使用a 类型参数,因为它没有在type 子句的“正文”中使用,并且(b) 为什么要添加Eq 约束。
  • @DarrelGulseth “好吧,如果我要在我的坐标中接受任何类型,那么是的,但我只想要整数”然后你不需要a。应该是type Coord = [(Int, Int)]
  • @DarrelGulseth 我看到了type Coord a = [(Int, Int)]。那里有一个 a 对你没有任何用处,除非你接受任何类型。

标签: function variables haskell functional-programming


【解决方案1】:

这将是对列表中的每个元素执行某些操作的手动方式:

type Coord = [(Int, Int)]

multiplyXBy2 :: Coord -> Coord
multiplyXBy2 [] = []
multiplyXBy2 ((x, y):rest) = (x*2, y) : multiplyXBy2 rest

这是通过ghci 调用的:

*Main> multiplyXBy2 [(1,2), (3,4)]
[(2,2),(6,4)]

有关使用语言的基础知识,例如如何访问传递给函数的列表元素或如何以编程方式构建列表,请考虑遵循 LYAH 的 Syntax in Functions 或 RWH 的 Defining Types, Streamlining Functions 等教程

【讨论】:

  • 可能更“高级”(虽然不是真的),但您可以通过将其定义为 multiplyXBy2 = map (\(x, y) -> (2*x, y)) 来大大简化这一点。甚至是multiplyXBy2 = (map . first) (*2)(如果你是import Control.Arrow)。
猜你喜欢
  • 2019-08-22
  • 2019-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-18
相关资源
最近更新 更多