Aka*_*ash 5 f# functional-programming functor
地图函数(Seq.map,List.map等)是否具有隐含的后置条件,即输出与输入具有相同数量的项目?更进一步,如果我们有某种Tree.map函数,是否假设输入和输出树的"形状"是相同的?
我问的原因是我总是做出这样的假设(我怀疑很多映射在序列上的代码也会这样做),但后来我发现如果映射函数产生重复,Set.map可以返回一个较小的集合. .因此,我的假设无效,或者Set不应被视为用于映射目的的序列.这是什么?
观点很多,以下是我的观点:
我们可以将所有函数/方法视为 Haskell 的Functor的map特定情况。根据该定义,我们可以假设该结构将被保留(加上一些其他有趣的属性)。fmap
但在 .NET 中没有类型类,因此我们可以定义map“受限函子”,结果是一些函子属性将不会被保留,但由于没有受影响的通用代码,因此影响是有限的。
所以没有什么可以阻止我们定义map:
请注意,在某些情况下,类型和值级别都有限制,例如,对于集合,类型级别的限制是类型 'a 和 'b 都应该进行比较,而对函数值的限制是函数应该是单射的。
如果语言能够表达类型级别约束,则在不满足这些要求时编译器将抛出错误。
对于函数值,没有编译时限制,但如果我们想确保它们正确,我们可以创建单元测试。但是如果我们不关心限制这些功能会发生什么?
好吧,只要我们了解一些Functor属性不会被遵守,那么在受限Functor上使用映射就没有什么问题。
所以我们可以定义map像排序列表这样的 over 结构,当然我们不能假设在这些情况下它map a >> map b总是等价的map (a >> b) 。这里的限制是函数应该单调递增。
注意:对于 Haskell,有一个包含受限函子和 Sets 实例的包