scalaz’Functor如何被赋予具有上下文绑定的更高级别的类型?
发布时间:2020-12-16 08:47:15 所属栏目:安全 来源:网络整理
导读:我想为以下类定义Functor实例: class RequiresManifest[A: Manifest] { def value: A}class RequiresAnyRef[A : AnyRef] { def value: A}class RequiresBothManifestAndAnyRef[A : AnyRef: Manifest] { def value: A} 这可能吗 ?或者可以定义’BoundedFunc
我想为以下类定义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,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. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |