我想为以下类定义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将会开始.
最佳答案 在数学中,参见仿函数是从一个类别到另一个类别的映射.在Comp Sci中,人们相信仿函数是一个endofunctor,例如对于Scala话语,它在所有Scala类型上定义.
这就是scalaz的实现方式.
但它不一定是这样.据我所知,在你的情况下,你有一个子类别(大致由Bound定义);仿函数将从Bound到Scala.
一般来说这是一个好主意,没有太多探索.我相信我们必须进一步调查.虽然在编程语言中明确定义类别,但这有点问题.甚至不确定Agda.