【问题标题】:How to use the contents of a list to output a new list?如何使用列表的内容来输出一个新的列表?
【发布时间】:2021-11-13 17:14:10
【问题描述】:

我正在寻找一种方法来了解如何使用一种类型的列表的内容来输出另一种类型的列表以供在游戏中使用。

data Dir   = N | E | S | W deriving (Show,Eq)
data Steps = Forward | Right | Back | Left deriving Show

quickGame :: Dir -> [Dir] -> [Steps]
quickGame d [] = []

因此,如果quickGame N [S,W,E,N,N] 是输入,我将收到 [Back,Right,Back,Left,Forward] 作为回报。

任何帮助将不胜感激。我已经尝试过 if then else 遍历列表以输出第二个,但必须有更清洁的方法吗?

【问题讨论】:

  • 为什么不是[Back, Right, Left, Forward, Forward]
  • 在数据构造函数上使用模式匹配对我来说似乎是最干净的方法,但我不明白您的示例输入/输出是如何工作的。你确定它是正确的吗?
  • 您能用文字解释一下您是如何从示例中的输入列表中获取输出列表的吗?你有两个N 去不同的输出,所以它显然不仅仅依赖于一对一的映射。你提出的算法是什么?
  • 您可能希望在您面对的方向和您移动的方向之间做出更明确的区分。例如,如果您朝北并向南迈出一步,则结果是您朝南。朝南向西走一步会导致您朝西(如果您仍然朝东,则相对于向东)。

标签: haskell list-comprehension


【解决方案1】:

首先,您将与 Either 类型的内置 LeftRight 构造函数发生冲突,所以让我们重新定义:

data Step = F | R | B | L deriving Show

然后,让我们定义一个助手,将当前方向与新方向进行比较,并返回适当的步骤。这很乏味,但相对简单。

step :: Dir -> Dir -> Step
step N N = F
step N E = R
step N S = B
step N W = L
step E N = L
step E E = F
step E S = R
step E W = B
step S N = B
step S E = L
step S S = F
step S W = R
step W N = R
step W E = B
step W S = L
step W W = F

现在,quickGame 可以通过将当前方向(第一个参数)与下一个方向(第二个参数的第一个元素)进行比较并输出适当的步骤来递归表示,然后用新方向递归调用 quickGame作为“当前”:

quickGame :: Dir -> [Dir] -> [Steps]
quickGame cur (nxt:rest) = step cur nxt : quickGame nxt rest
quickGame _ [] = []

最终代码:

data Dir  = N | E | S | W deriving Show
data Step = F | R | B | L deriving Show

quickGame :: Dir -> [Dir] -> [Step]
quickGame cur (nxt:rest) = step cur nxt : quickGame nxt rest
quickGame _ [] = []

step :: Dir -> Dir -> Step
step N N = F
step N E = R
step N S = B
step N W = L
step E N = L
step E E = F
step E S = R
step E W = B
step S N = B
step S E = L
step S S = F
step S W = R
step W N = R
step W E = B
step W S = L
step W W = F

main = do
  print $ quickGame N [S,W,E,N,N]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 2015-11-07
    • 2011-08-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多