haskell记录位置功能

时间:2018-02-08 13:22:56

标签: function haskell position

我试图编写一个函数,它将返回一个包含起点所有位置的列表。例如,如果我写 “位置[L,R,L,L,U](0,0)”出来必须是“[(0,0),( - 1,0),(0,0),( - 1,0 ),( - 2,0),( - 2,1)]“。

使用以下功能我只能得到结束位置。任何人都可以帮助我吗?

type Position = (Int,Int)
data Step = L | R | U | D

type Route = [Step]

positions :: Route -> Position-> [Position]
positions [] p = p:[]
positions (m:ms) p = positions ms (move m p)

1 个答案:

答案 0 :(得分:2)

您的代码建议您已经定义了一个函数move :: Step -> Position -> Position,然后我们可以使用scanl :: (b -> a -> b) -> b -> [a] -> [b]

positions :: [Step] -> Position -> [Position]
positions = flip (scanl (flip move))

scanl :: (b -> a -> b) -> b -> [a] -> [b]因此输入一个函数(这里是flip move),它给出了初始累加器(这里是Position)和列表的元素(移动列表),并计算更新的累加器。然后我们给它初始累加器和位置列表。

由于我们的move :: Step -> Position -> Positionpositions :: [Step] -> Position -> [Position]函数已翻转参数(wrt scanl),我们都会翻转move函数,以及我们用{{1}构造的函数}}