【发布时间】:2018-02-20 17:18:21
【问题描述】:
我正在阅读关于 catamorphisms 的维基百科文章,目前我能够在 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# 中实现吗?
【问题讨论】:
-
您可以为特定的数据类型(例如
List.fold)定义它,但不像您引用的示例那样一般。 -
这需要更高的种类:大致上,能够定义
T f = f Bool,其中f : *->*。你可以在 Haskell 或 Scala 中这样做,但我不知道 F# 是否允许这样做。 -
@chi:在基于去功能化的编码之外,它不会。
标签: haskell f# catamorphism