Function haskell记录位置函数
我正在尝试写一个函数,它将返回一个列表,其中包含从起点开始的所有位置。例如,如果我写 “位置[L,R,L,L,U](0,0)”结果必须是“[(0,0),(-1,0),(-1,0),(-2,0),(-2,1)]” 使用下面的函数,我只得到结束位置。有人能帮我吗Function haskell记录位置函数,function,haskell,position,Function,Haskell,Position,我正在尝试写一个函数,它将返回一个列表,其中包含从起点开始的所有位置。例如,如果我写 “位置[L,R,L,L,U](0,0)”结果必须是“[(0,0),(-1,0),(-1,0),(-2,0),(-2,1)]” 使用下面的函数,我只得到结束位置。有人能帮我吗 type Position = (Int,Int) data Step = L | R | U | D type Route = [Step] positions :: Route -> Position-> [Positi
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)
您的代码表明您已经定义了一个函数
move::Step->Position->Position
,然后我们可以使用:
scanl::(b->a->b)->b->[a]->[b]
因此将给定初始累加器(此处a位置
)和列表元素(移动列表)的函数(此处翻转移动
)作为输入,并计算更新后的累加器。然后我们给它初始累加器和位置列表
由于我们的
move::Step->Position->Position
和positions::[Step]->Position->[Position]
函数已经翻转了参数(w.r.t.scanl
),我们都翻转了move
函数,以及我们用scanl构建的函数(翻转移动)
您的代码表明您已经定义了一个函数move::Step->Position->Position
,然后我们可以使用:
scanl::(b->a->b)->b->[a]->[b]
因此将给定初始累加器(此处a位置
)和列表元素(移动列表)的函数(此处翻转移动
)作为输入,并计算更新后的累加器。然后我们给它初始累加器和位置列表
由于我们的
move::Step->Position->Position
和positions::[Step]->Position->[Position]
函数已经翻转了参数(w.r.t.scanl
),我们都翻转了move
函数,以及我们用scanl构建的函数(翻转移动)
您可以定义一个指定一个时刻的函数,然后使用scanl
。您可以定义一个指定一个时刻的函数,然后使用scanl
。是的,我有一个移动函数,但当我试图定义scanl时,我出现了一个错误“scanl”的类型签名缺少附带的绑定(必须在声明“scanl”的位置提供类型签名)@你不需要定义scanl
,scanl
是一个前奏函数。你为什么要定义scanl
?这是一个库函数。哦,好吧,现在我明白发生了什么!非常感谢!:我有一个移动函数,但当我试图定义scanl时,我有一个错误。”“scanl”的类型签名缺少附带的绑定(必须在声明“scanl”的位置提供类型签名)@你不需要定义scanl
,scanl
是一个前奏函数。你为什么要定义scanl
?这是一个库函数。哦,好吧,现在我明白了发生了什么!非常感谢!:D
positions :: [Step] -> Position -> [Position]
positions = flip (scanl (flip move))