Haskell中的Comonad类型类是什么?作为Comonad从Control.Comonad在comonad包(即提供Comonad类型类也是任何其他包的说明欢迎).我模糊地听说过Comonad,但我真正知道的是它提供的extract :: w a -> a,与Monad相似return :: a -> m a.
在"真实"代码中注意Comonad的"真实生活"用途的奖励积分.
可以说我有以下内容:
data FuncAndValue v res = FuncAndValue (v -> res) v
chain :: (res -> new_res) -> FuncAndValue v res -> FuncAndValue v new_res
chain new_f (FuncAndValue old_f v) = FuncAndValue (new_f . old_f) v
Run Code Online (Sandbox Code Playgroud)
被GHC可能能够结合功能new_f并old_f通过内联成一个单一的功能?
基本上,以数据类型存储函数无论如何都会抑制优化.
我希望GHC能够轻松地将函数链组合成一个(即所以我的结构上的"总和"不涉及重复调用代表的thunk,(+)而只是内联,(+)因此它像for循环一样运行.我希望将函数存储在数据类型中,然后稍后访问它们不会抑制它.
我使用Store comonad 编写了Conway的生命游戏的简单实现(参见下面的代码).我的问题是,从第五次迭代开始,网格生成明显变慢.我的问题与我使用Store comonad的事实有关吗?还是我犯了一个明显的错误?据我所知,其他的实现,这是基于拉链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) …Run Code Online (Sandbox Code Playgroud)