我正在阅读维基百科关于变形的文章,目前我能够在F#中复制Haskell的例子,但这部分除外:
type Algebra f a = f a -> a -- the generic f-algebras
newtype Fix f = Iso { invIso :: f (Fix f) } -- gives us the initial algebra for the functor f
cata :: Functor f => Algebra f a -> (Fix f -> a) -- catamorphism from Fix f to a
cata alg = alg . fmap (cata alg) . invIso -- note that invIso and alg map in opposite directions在F#中可以这样做吗?
发布于 2017-09-12 22:32:26
如果您正在考虑在任意容器类型(a‘’la 递归格式 )上表达真正的泛型折叠,直接在F# (或CLR )类型系统中--那么您就倒霉了。语言中缺少太多所需的机器--最关键的是更高的类型。
然而,HKT可以使用一种称为F#的技术在去功能化中进行编码。有一个基于本文概念的F#库-更高。实际上,它已经实现了fix,cata/ana/同构和代数作为概念的证明。在性能和易用性方面,我没有一个很好的衡量标准。
除此之外,您还可以手工为您的容器实现折叠,省去了HKT的需求。目前,有一系列关于实现变形这里的经典博客文章。这是非常值得一读的-除了折叠,它还深入到编程的延续-传递风格。
https://stackoverflow.com/questions/46173077
复制相似问题