我在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约束。有没有更惯用的方式编写此函数?
我希望尝试在大量输入上运行一个适度昂贵的函数,使用该函数的部分输出作为其输入之一。代码按预期运行,不幸的是它在进程中消耗了大量内存(堆上不到 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)