мемоизировать функцию step?:
```
buildAlg :: forall m . MonadState Integer m => Point -> m (Alg m Point)
buildAlg dst = return $ Alg { select = select, step = step, stopCond = stopCond }
where
select :: m Direction
select = do
modify $ \n -> if even n then n div 2 else n * 3 + 1
state <- get
return $ toEnum $ fromIntegral state mod 4
step :: Direction -> Point -> m Point
step d (Point i j) = return $
case d of
U -> Point (i - 1) (j)
D -> Point (i + 1) (j)
L -> Point (i) (j - 1)
R -> Point (i) (j + 1)
stopCond :: Point -> m Bool
stopCond p = return $ dst == p
```
То есть есть некоторый алгоритм, который вызывает функции select, step и stopCond, и потенциально (например) step может быть тяжёлым и хочется закешировать результаты её работы.
Я пробовал подключить uglymemo, но он по-видимому работает только для рекурсивных функций, а хочется кэш, который бы переживал между вызовами, причём новый начинался бы с вызова buildAlg.
Полный пример здесь:
https://github.com/nlinker/playground/blob/master/haskell/stt-demo/src/Lib.hs
А MemoTrie?
Обсуждают сегодня