爲什麼當你定義函數複製 duplicate :: w a -> w (w a)
的Comonad類型類(link),你必須修改「的背景下,」所有元素(即更改除當前其他元素值的上下文)。爲什麼不只是使用類似的東西在Monad中返回? 例(拉鍊): data Z a = Z [a] a [a]
,爲什麼我就不能定義重複的 duplicate z = Z [] z []
我試圖得到要求
我們可以將monad描述爲計算上下文,monad實現完全保留該上下文的含義。 例如Option - 上下文的含義是值可能存在。 考慮到Option數據類型,唯一有意義的實現是pure = some, flatMap f = {none => none; some x => f x } 正如我對monad的理解一樣,通過遵循類型簽名 - 對於任何monad,只有一個合理的實現。換句話說,如果您想爲值
在我的應用程序中,我試圖實現一個動畫系統。在這個系統中,動畫被表示爲幀的循環列表: data CyclicList a = CL a [a]
我們可以(低效率)推進動畫如下: advance :: CyclicList a -> CyclicList a
advance (CL x []) = CL x []
advance (CL x (z:zs)) = CL z (zs ++ [x])
我需要下面的類的功能: class InterleavedHomomorphic x where
interleaveHomomorphism :: (forall a . f a -> g a) -> x f -> x g
顯然,我發明了它的名字是不以任何方式對任何一個官方的術語,上述類型的類是不是很優雅。這是一個有名字的概念,甚至是一些圖書館的實現嗎?有沒有更合理的方式來做到這一
data Tree t = Empty | Node t (Tree t) (Tree t)
我們可以創建函子實例,並使用 fmap :: (t -> a) -> Tree t -> Tree a
但是,如果不是(T - > A)我想(樹T - > A)這樣我就可以有機會獲得一個整體(節點T )不算了筆 treeMap :: (Tree t -> a) -> Tree t -> Tree
在沉思些什麼有用的標準類建議to this one class Coordinate c where
createCoordinate :: x -> y -> c x y
getFirst :: c x y -> x
getSecond :: c x y -> y
addCoordinates :: (Num x, Num y) => c x y -> c
我已經使用Store comonad編寫了Conway's Game of Life的簡單實現(請參閱下面的代碼)。我的問題是,從第五次迭代開始,網格生成速度明顯變慢。我的問題與我使用Store comonad的事實有關嗎?還是我犯了一個明顯的錯誤?據我所知,基於Zipper comonad的otherimplementations是高效的。 import Control.Comonad
da
我過去幾週一直在向一個將單子(主要是從mtl)轉移到箭頭的圖書館捐款。 下面是與StateT單子一個簡單的例子,從mtl: newtype StateT s m a = StateT { runStateT :: s -> m (a, s) }
-- arrowization -->
newtype StateTA s a b c = StateTA { runStateTA :: a (b,