[英]Can one express catamorphism through Data.Function.fix?
我這里有一個可愛的fixana
函數,執行速度比她姐姐ana
快5倍。 (我對此有一份criterion
報告來支持我)
ana alg = Fix . fmap (ana alg) . alg
fixana alg = fix $ \f -> Fix . fmap f . alg
我可以發表自己的表弟cata
以同樣的方式?
cata f = f . fmap (cata f) . unFix
在我看來,我不能,但過去我曾被SO研究員謙虛幾次。
實際上,這與變態無關。
每當函數定義為
f = (... f ...) -- some expression involving f
一個人可以用fix
重寫它
f = fix $ \g -> (... g ...)
在發布的代碼中,我們有一個稍微的變化
f x = (... (f x) ...)
我們可以將上面的f
視為遞歸定義。 但是,如果我們以遞歸方式定義fx
(而不是f
),則更為簡單。
f x = fix $ \g -> (... g ...)
這應該比普通翻譯更有效
f = fix $ \g x -> (... (g x) ...)
因為我們不需要用相同的參數x
反復調用g
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.