![](/img/trans.png)
[英]Once I have an F-Algebra, can I define Foldable and Traversable in terms of it?
[英]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
Monad
為Applicative
添加的功能是能夠將嵌套的 m
s展平為一m
。 這就是[]
的join
是concat
。 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)
和Traversable
為f
。 我的第一個直覺是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.