我试图编写一个函数,它将返回一个包含起点所有位置的列表。例如,如果我写 “位置[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)
答案 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 -> Position
和positions :: [Step] -> Position -> [Position]
函数已翻转参数(wrt scanl
),我们都会翻转move
函数,以及我们用{{1}构造的函数}}