小编Ste*_*gan的帖子

反射:创建可重置的延迟事件

我在Haskell中使用Reflex,并试图创建一个事件,该事件会触发(出于问题目的)一段指定的时间,比如说2秒。但是,计数器应在原始事件触发时重置,以便如果原始事件相隔1秒触发两次,则第二个事件应仅触发一次:最后一个原始事件后2秒。

我设法实现了这种行为

delayedReset :: MonadWidget t m => Event t () -> m (Event t ())
delayedReset ev = fmap (switch . current) . widgetHold (return never) $ timer <$ ev
  where
    timer = delay 2 =<< getPostBuild
Run Code Online (Sandbox Code Playgroud)

但是使用widgetHold似乎有些矫kill过正。似乎我们只应该真正需要MonadHold约束。有没有更惯用的方式编写此函数?

haskell frp reflex

5
推荐指数
1
解决办法
92
查看次数

我可以利用惰性求值来引用未来值而不会出现空间泄漏吗?

我希望尝试在大量输入上运行一个适度昂贵的函数,使用该函数的部分输出作为其输入之一。代码按预期运行,不幸的是它在进程中消耗了大量内存(堆上不到 22GiB,最大驻留时间刚好超过 1GiB)。这是我的意思的简化示例:

{-# LANGUAGE OverloadedStrings #-}

import Data.List (foldl')
import qualified Data.Text as T
import qualified Data.Text.Lazy as TL
import qualified Data.Text.Lazy.IO as TL
import qualified Data.Text.Lazy.Builder as TB

main :: IO ()
main = TL.putStr $ TB.toLazyText showInts

showInts :: TB.Builder
showInts = foldMap fst shownLines
  where
    shownLines = map (showInt maxwidth) [0..10^7]
    maxwidth = foldl' (\n -> max n . snd) 0 shownLines

showInt :: Int -> Int -> (TB.Builder, Int)
showInt maxwidth n = (builder, len) …
Run Code Online (Sandbox Code Playgroud)

haskell space-leak

5
推荐指数
1
解决办法
124
查看次数

标签 统计

haskell ×2

frp ×1

reflex ×1

space-leak ×1