如何scalaz”仿函数被赋予与上下文更高kinded型约束?(How can scalaz'

2019-09-17 16:43发布

我想定义一个仿函数实例为以下类别:

class RequiresManifest[A: Manifest] {
  def value: A
}

class RequiresAnyRef[A <: AnyRef] {
  def value: A
}

class RequiresBothManifestAndAnyRef[A <: AnyRef: Manifest] {
  def value: A
}

这可能吗 ? 可替换地可以在“BoundedFunctor性状界定? 是这样的:

trait BoundedFunctor[F[_], Bound[_]] {
  def fmap[A: Bound, B: Bound](r: F[A], f: A => B): F[B]
}

这里是我的激励例如:如何定义的类TypedConverter函子。

import com.thoughtworks.xstream.converters.Converter

abstract class TypedConverter[A <: AnyRef: Manifest] extends Converter { 
  final def canConvert(klass: Class[_]) = 
    manifest[A].erasure.isAssignableFrom(klass)

  final def marshal(value: AnyRef, writer: HierarchicalStreamWriter, 
                    context: MarshallingContext) =
    typedMarshal(value.asInstanceOf[A], writer, context)

  final def unmarshal(reader: HierarchicalStreamReader, 
                      context: UnmarshallingContext) = 
    typedUnmarshal(reader, context)

  def typedMarshal(value: A, writer: HierarchicalStreamWriter, 
                   context: MarshallingContext): Unit

  def typedUnmarshal(reader: HierarchicalStreamReader, 
                     context: UnmarshallingContext): A
}

这-kinded较高的类型都有其类型参数的两个约束,一是清单,因为这是在“canConvert”,第二AnyRef的实施中,因为解组需要一个对象。

其实,我试图创建一个InvariantFunctor,但仿函数会做下手。

Answer 1:

见,在数学,函子是从一类到另一个的映射。 在基本的计算机科学莫名其妙的人相信一个仿函数是一个endofunctor,例如用于Scala的话语,这是对所有类型的Scala定义。

这是scalaz的实现是怎么写的。

但它并没有如此。 据我了解,你的情况,你有一个子类(由绑定一个粗略的定义); 所以仿函数会从绑定到斯卡拉。

这是一般的好主意,没有太大的探索。 我相信我们必须去作进一步调查。 这是一个有点问题,虽然明确的编程语言定义的类别。 甚至不知道关于阿格达。



文章来源: How can scalaz' Functor be given a higher-kinded type with a context bound?
标签: scala scalaz