加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

Scala构造函数抽象

发布时间:2020-12-16 08:49:14 所属栏目:安全 来源:网络整理
导读:Scala中可以使用以下内容: scala val l = Listl: scala.collection.immutable.List.type = scala.collection.immutable.List$@7960c21ascala l ( 1,2,3 )res0: List[Int] = List(1,3) 换句话说,Scala具有更高阶的多态性.我想使用高阶多态来执行以下操作. se
Scala中可以使用以下内容:

scala> val l = List
l: scala.collection.immutable.List.type = scala.collection.immutable.List$@7960c21a

scala> l ( 1,2,3 )
res0: List[Int] = List(1,3)

换句话说,Scala具有更高阶的多态性.我想使用高阶多态来执行以下操作.

sealed abstract class A { def eval () : A }
case class A0 () extends A { ... }
case class A1 ( a : A ) extends A { ... }
case class A2 ( a : A,b : A ) extends A { ... }
....

所以我有一堆案例类,A的子类,其构造函数不一定采用相同数量的参数.我也希望有一个’通用’案例类,如下所示:

case class ApplyA ( c : ???,l : List [ A ] ) extends A {
   def eval () : A = { ??? } }

这个想法是,ApplyA将第一个参数作为A的子类型和参数列表的构造函数.然后,如果可能,eval方法使用构造函数构造一个适当的类(即列表具有正确的长度)并返回它
(这对应于上面列表示例中的l(1,3)). ApplyA的第一个构造函数的参数类型是什么?

这应该是高阶多态的可能,但我无法弄清楚如何.我知道即使不使用高阶多态,只需在函数中包装构造函数,然后将这些函数作为第一个参数传递给ApplyA的构造函数,我就可以做到这一点,但我想了解如何直接使用高阶多态.

解决方法

问题是List示例根本不涉及任何高阶多态. List.apply只需要可变数量的参数:

def apply(xs: A*)

高阶多态性涉及将类型构造函数作为类型参数的方法或类型,例如,

def fmap[F[_],A](x: F[A]): F[B]

所以不,你不能使用高阶多态.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读