我有Haslell指示以及如何使它成为Ints?

Dan*_*nyJ -7 haskell

我有方向,我就是这样的第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)

Tho*_*son 5

我相信,我知道你有一个数据类型命名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- 来解决问题,或者您可以创建自己的原始递归函数.