【问题标题】:Catamorphism in F#F# 中的变质
【发布时间】: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


【解决方案1】:

如果您想直接在 F#(或 CLR)类型系统中表达对任意容器类型(a'la recursion schemes)的真正通用折叠,那么您就不走运了。语言中缺少太多必需的机制——最关键的是高级类型。

但是,可以使用称为defunctionalization 的技术在 F# 中对 HKT 进行编码。有一个基于本文概念的 F# 库 - Higher。事实上,它已经实现了fix, cata/ana/hylomorphismsalgebras 作为概念证明。不过,在性能和易用性方面,我没有很好的衡量标准。

除此之外,您还可以手动实现专门为您的容器设计的折叠,而无需使用 HKT。现在有一个关于实现变态的经典博客文章here。非常值得一读 - 除了折叠之外,它还深入探讨了延续传递风格的编程。

【讨论】:

  • 谢谢。该材料看起来非常好,我将通过它。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-07-10
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
相关资源
最近更新 更多