我有方向,我就是这样的第1步
这是方向:
North (x,y) = (x,y+1)
East (x,y) = (x+1,y)
South (x,y) = (x, y-1)
West (x,y) = (x-1, y)
Run Code Online (Sandbox Code Playgroud)
怎么实现那样?
f13 :: [Dir] -> (Int,Int)
f13 [North, North] == (0,2)
f13 [North, East, South, West] == (0,0)
f13 (replicate 10 East) == (10,0)
Run Code Online (Sandbox Code Playgroud)
我的代码:
a = 0
b = 0
f13 :: [Dir] -> (Int,Int)
--f13 xs = (a,b+1)
f13 xs | xs == North = (a,b+1)
| xs == East = (a+1,b)
| xs == South = (a,b-1)
| xs == West = (a-1,b)
| otherwise = (a,b)
Run Code Online (Sandbox Code Playgroud)
我相信,我知道你有一个数据类型命名Dir具有构造的North,South,East,和West:
data Dir = North | South | East | West
Run Code Online (Sandbox Code Playgroud)
并且您要创建一个函数,使用起始位置和多个类型值的步骤列表计算网格上的新位置,这是我们获取列表的位置. Dir[Dir]
如果这是正确的,那么考虑做两个单独的功能.第一个功能一次只需一步.我们可以简单地匹配每个模式(北,南,东,西)并分别处理每个案例:
step :: (Int, Int) -- ^ The starting point
-> Dir -- ^ The direction to step
-> (Int, Int) -- ^ Where we end up
step (x,y) North = (x,y+1)
step (x,y) South = (x,y-1)
step (x,y) East = (x+1,y)
step (x,y) West = (x-1,y)
Run Code Online (Sandbox Code Playgroud)
现在我们已经有了基本映射,它定义了Dir与网格的关系,我们可以反复将它应用到一个方向列表中.我会把这部分留给你.您可以四处查看如何使用折叠 - 特别是foldl- 来解决问题,或者您可以创建自己的原始递归函数.