4

我想为以下类定义一个 Functor 实例:

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 类定义 Functor。

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
}

这种更高种类的类型对其类型参数有两个约束,第一个是 Manifest,因为它用于“canConvert”的实现,第二个是 AnyRef,因为 unmarshal 需要一个 Object。

实际上我正在尝试创建一个 InvariantFunctor,但 Functor 会开始。

4

1 回答 1

2

看,在数学中,函子是从一个类别到另一个类别的映射。在 Comp Sci 中,人们不知何故相信函子是内函子,例如对于 Scala 话语,它在所有 Scala 类型上都定义了。

scalaz 的实现就是这样写的。

但它不必如此。据我了解,在您的情况下,您有一个子类别(大致由 Bound 定义);所以函子将从 Bound 到 Scala。

总的来说这是一个好主意,没有太多探索。我相信我们必须进一步调查。尽管在编程语言中明确定义类别有点问题。甚至不确定Agda。

于 2012-08-05T01:40:18.453 回答