簡體   English   中英

授予可遍歷的F代數,是否有可能在適用代數上具有同構關系?

[英]Granted a traversable F-Algebra, is it possible to have a catamorphism over an applicative algebra?

我有這個F代數( 在上一個問題中介紹過 ),我想在其上施加一個有效的代數。 通過絕望的嘗試,我設法將一元變態融合了。 我想知道它是否可以推廣到一個應用程序,如果不能推廣,為什么?

這就是我定義Traversable

instance Traversable Expr where
    traverse f (Branch xs) = fmap Branch $ traverse f xs
    traverse f (Leaf   i ) = pure $ Leaf i

這是單子變態:

type AlgebraM a f b = a b -> f b

cataM :: (Monad f, Traversable a) => AlgebraM a f b -> Fix a -> f b
cataM f x = f =<< (traverse (cataM f) . unFix $ x)

這是它的工作方式:

λ let printAndReturn x = print x >> pure x
λ cataM (printAndReturn . evalSum) $ branch [branch [leaf 1, leaf 2], leaf 3]
1
2
3
3
6
6

我現在的想法是我可以這樣重寫:

cataA :: (Applicative f, Traversable a) => AlgebraM a f b -> Fix a -> f b
cataA f x = do
    subtree <- traverse (cataA f) . unFix $ x
    value <- f subtree
    return value

不幸的是,這里的value取決於subtree並且根據有關應用表示法的論文 ,在這種情況下,我們不能將糖簡化為應用程序。 似乎沒有辦法解決這個問題。 我們需要一個monad從嵌套深處浮起。

是真的嗎 我能否安全地得出結論,只有平坦的結構可以單獨折疊才能產生效果?

我能否安全地得出結論,只有平坦的結構可以單獨折疊才能產生效果?

你可以再說一遍! 畢竟,“扁平化嵌套結構”是什么讓一個單子一個單子,而不是Applicative只能結合鄰近結構。 比較兩個抽象的簽名(的一個版本):

class Functor f => Applicative f where
    pure :: a -> f a
    (<.>) :: f a -> f b -> f (a, b)

class Applicative m => Monad m where
    join :: m (m a) -> m a

MonadApplicative添加的功能是能夠將嵌套的 m s展平為一m 這就是[]joinconcat Applicative只允許你一起粉碎迄今無關f秒。

這並非巧合的是,免費的單子的Free構造包含整個f充滿了Free f S,而免費應用性的Ap構造函數只包含一個Ap f

data Free f a = Return a | Free (f (Free f a))
data Ap f a where
    Pure :: a -> Ap f a
    Cons :: f a -> Ap f b -> Ap f (a, b)

希望這使您對為什么應該使用Applicative不能折疊樹感到直覺。

讓我們打一點網球 ,看看它如何震動。 我們要寫

cataA :: (Traversable f, Applicative m) => (f a -> m a) -> Fix f -> m a
cataA f (Fix xs) = _

我們有xs :: f (Fix f)Traversablef 我的第一個直覺是traverse f來折疊包含的子樹:

cataA f (Fix xs) = _ $ traverse (cataA f) xs

現在,該洞的目標類型為m (fa) -> ma 由於有一個f :: fa -> ma敲門,讓我們嘗試在m下轉換包含的f s:

cataA f (Fix xs) = _ $ fmap f $ traverse (cataA f) xs

現在我們有了一個目標類型m (ma) -> ma ,它是join 因此,您畢竟需要Monad

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM