【问题标题】:haskell recording positions functionhaskell 记录仓位功能
【发布时间】:2018-02-08 13:22:55
【问题描述】:

我正在尝试编写一个函数,该函数将返回一个列表,其中包含从起点开始的所有位置。例如,如果我写 "positions [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)

【问题讨论】:

  • 可以定义一个指定时刻的函数,然后使用scanl

标签: function haskell position


【解决方案1】:

您的代码表明您已经定义了一个函数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] 函数具有翻转参数(w.r.t. scanl),我们都翻转了 move 函数,以及我们使用 scanl (flip move) 构造的函数。

【讨论】:

  • 是的,我确实有一个移动功能,但是当我尝试定义 scanl 时,我遇到错误“'scanl' 的类型签名缺少随附的绑定(类型签名必须在 'scanl'被声明)
  • @PinelopiConstantinou:你不需要定义scanlscanl是一个前奏函数。
  • 你为什么要定义scanl?这是一个库函数。
  • 哦,好吧,现在我明白发生了什么!非常感谢! :D
猜你喜欢
  • 2023-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-15
  • 2011-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多