Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何避免在Helm/Elerea(Haskell FRP)中失控的内存/cpu使用?_Haskell_Frp_Elerea - Fatal编程技术网

如何避免在Helm/Elerea(Haskell FRP)中失控的内存/cpu使用?

如何避免在Helm/Elerea(Haskell FRP)中失控的内存/cpu使用?,haskell,frp,elerea,Haskell,Frp,Elerea,我正在用玻璃钢浸泡我的脚趾,我已经用Hell(基于示例)组装了一个基本的“hello world”风格的应用程序: 导入玻璃钢舵 进口合格的FRP.Helm.Window作为窗 输入合格的FRP.Helm.Keyboard作为键盘 进口FRP.Elerea.Simple 数据SpriteState=SpriteState{mx::Double,my::Double} 输入信号::信号发生器(信号(双,双)) inputSignal=提升到RAC键盘。箭头 其中toFrac(dx,dy)=(rea

我正在用玻璃钢浸泡我的脚趾,我已经用Hell(基于示例)组装了一个基本的“hello world”风格的应用程序:

导入玻璃钢舵
进口合格的FRP.Helm.Window作为窗
输入合格的FRP.Helm.Keyboard作为键盘
进口FRP.Elerea.Simple
数据SpriteState=SpriteState{mx::Double,my::Double}
输入信号::信号发生器(信号(双,双))
inputSignal=提升到RAC键盘。箭头
其中toFrac(dx,dy)=(realToFrac dx,realToFrac dy)
精灵信号::信号发生器(信号精灵测试)
spriteSignal=foldp新闻状态初始状态输入信号
哪里
initialState=SpriteState{mx=0,my=200}
newState(dx,dy)state=state{mx=x',my=y'}
其中x'=mx状态+dx
y'=我的状态+dy
spriteForm::SpriteState->Form
spriteForm state=移动(mx状态,我的状态)img
式中,img=填充的蓝色$64方形
render::SpriteState->(Int,Int)->元素
渲染spriteState(w,h)=中心拼贴w h$[spriteForm spriteState]
main=do

我认为
foldp
不太可能积累内存。精灵状态在每一步都会被完全评估,因为渲染图像需要这些信息。事实上,GHC运行时似乎根本没有使用那么多内存(尝试使用
-s
运行)。我怀疑这是因为Helm没有释放一些SDL分配的数据。@IanHenry太棒了!谢谢你的提醒。
import FRP.Helm
import qualified FRP.Helm.Window as Window
import qualified FRP.Helm.Keyboard as Keyboard
import FRP.Elerea.Simple

data SpriteState = SpriteState {mx::Double, my::Double}

inputSignal::SignalGen (Signal (Double, Double))
inputSignal = lift toFrac Keyboard.arrows
  where toFrac (dx, dy) = (realToFrac dx, realToFrac dy)

spriteSignal::SignalGen (Signal SpriteState)
spriteSignal = foldp newState initialState inputSignal
  where
    initialState = SpriteState {mx = 0, my = 200}
    newState (dx, dy) state = state {mx = x', my = y'}
      where x' = mx state + dx
            y' = my state + dy

spriteForm::SpriteState -> Form
spriteForm state = move (mx state, my state) img
  where img = filled blue $ square 64

render::SpriteState -> (Int, Int) -> Element
render spriteState (w, h) = centeredCollage w h $ [spriteForm spriteState]

main = do
  engine <- startup defaultConfig
  run engine $ render <~ spriteSignal ~~ (Window.dimensions engine)