gpt4 book ai didi

使用 Store comonad 的 Conway 生命游戏的性能

转载 作者:行者123 更新时间:2023-12-04 03:21:05 24 4
gpt4 key购买 nike

我已经编写了 Conway's Game of Life 的简单实现使用 Store comonad(见下面的代码)。我的问题是网格生成从第五次迭代开始明显变慢。我的问题是否与我正在使用 Store comonad 有关?还是我犯了一个明显的错误?据我所知,other implementations ,基于 Zipper comonad,是高效的。

import Control.Comonad

data Store s a = Store (s -> a) s

instance Functor (Store s) where
fmap f (Store g s) = Store (f . g) s

instance Comonad (Store s) where
extract (Store f a) = f a
duplicate (Store f s) = Store (Store f) s

type Pos = (Int, Int)

seed :: Store Pos Bool
seed = Store g (0, 0)
where
g ( 0, 1) = True
g ( 1, 0) = True
g (-1, -1) = True
g (-1, 0) = True
g (-1, 1) = True
g _ = False

neighbours8 :: [Pos]
neighbours8 = [(x, y) | x <- [-1..1], y <- [-1..1], (x, y) /= (0, 0)]

move :: Store Pos a -> Pos -> Store Pos a
move (Store f (x, y)) (dx, dy) = Store f (x + dx, y + dy)

count :: [Bool] -> Int
count = length . filter id

getNrAliveNeighs :: Store Pos Bool -> Int
getNrAliveNeighs s = count $ fmap (extract . move s) neighbours8

rule :: Store Pos Bool -> Bool
rule s = let n = getNrAliveNeighs s
in case (extract s) of
True -> 2 <= n && n <= 3
False -> n == 3

blockToStr :: [[Bool]] -> String
blockToStr = unlines . fmap (fmap f)
where
f True = '*'
f False = '.'

getBlock :: Int -> Store Pos a -> [[a]]
getBlock n store@(Store _ (x, y)) =
[[extract (move store (dx, dy)) | dy <- yrange] | dx <- xrange]
where
yrange = [(x - n)..(y + n)]
xrange = reverse yrange

example :: IO ()
example = putStrLn
$ unlines
$ take 7
$ fmap (blockToStr . getBlock 5)
$ iterate (extend rule) seed

最佳答案

store comonad 本身并不真正存储任何东西(除了抽象意义上的函数是一个“容器”),但必须从头开始计算它。在几次迭代后,这显然变得非常低效。

不过,如果您仅使用 some memoisation 备份 s -> a 函数,则可以在不更改代码的情况下缓解这种情况。 :

import Data.MemoTrie

instance HasTrie s => Functor (Store s) where
fmap f (Store g s) = Store (memo $ f . g) s

instance HasTrie s => Comonad (Store s) where
extract (Store f a) = f a
duplicate (Store f s) = Store (Store f) s

尚未测试这是否真的提供了可接受的性能。

顺便说一句,Edward Kmett 有一个明确内存的版本 in an old version of the comonad-extras package ,但现在不见了。我最近 looked if that still works (似乎是这样,在调整依赖关系之后)。

关于使用 Store comonad 的 Conway 生命游戏的性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45506813/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com