我最终搞清楚了.请参阅我给出的演讲的视频和幻灯片:
原始问题:
在我努力理解通用递归方案(即使用Fix)时,我发现编写各种方案的仅列表版本很有用.它使得理解实际方案变得更加容易(没有额外的开销Fix).
但是,我还没有想出如何定义只列出版本zygo和futu.
以下是我目前的专门定义:
cataL :: (a -> b -> b) -> b -> [a] -> b
cataL f b (a : as) = f a (cataL f b as)
cataL _ b [] = b
paraL :: (a -> [a] -> b -> b) -> b -> [a] -> b
paraL f b (a : as) = f a as (paraL f b as)
paraL _ b …Run Code Online (Sandbox Code Playgroud) 我希望尝试在大量输入上运行一个适度昂贵的函数,使用该函数的部分输出作为其输入之一。代码按预期运行,不幸的是它在进程中消耗了大量内存(堆上不到 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)