在Scala中键入参数与成员类型
我想知道成员类型如何在
Scala中工作,以及如何关联类型.
一种方法是使关联类型成为一个类型参数.这种方法的优点是我可以规定类型的方差,我可以确定子类型不会改变类型.缺点是我不能从函数中的类型推断类型参数. 第二种方法是使相关类型成为第二种类型的成员,其问题是我无法在子类型的关联类型上规定边界,因此我不能使用函数参数中的类型(当x: X,X#T可能与xT无任何关系) 一个具体的例子是: 我有一个特征为DFA(可能没有类型参数) trait DFA[S] { /* S is the type of the symbols in the alphabet */ trait State { def next(x : S); } /* final type Sigma = S */ } 我想创建一个通过输入序列运行??此DFA的功能,我想要 >该函数必须采取任何<%Seq [字母类型的dfa]作为输入序列类型 我试过这个: def runDFA[S,D <: DFA[S],SQ <% Seq[S]](d : D)(seq : SQ) = .... 这是有效的,除了类型S不在这里推断,所以我必须在每个呼叫站点上写入整个类型的参数列表. def runDFA[D <: DFA[S] forSome { type S },SQ <% Seq[D#Sigma]]( ... same as above 这没有工作(无效循环引用D型(是什么?)) 我也删除了type参数,创建了一个抽象类型Sigma,并尝试在具体类中绑定该类型. runDFA看起来像 def runDFA[D <: DFA,SQ <% Seq[D#Sigma]]( ... same as above 但这不可避免地会遇到诸如“类型不匹配:预期的dfa.Sigma,得到D#Sigma” 有任何想法吗?指针? 编辑: 由于答案表明没有简单的方法可以做到这一点,有人可以详细阐述为什么它是不可能的,什么是必须改变,所以它的工作? 我想要runDFA ro是一个免费函数(不是一种方法)的原因是我想要其他类似的功能,如自动机最小化,常规语言操作,NFA到DFA转换,语言因子分解等,并将所有这些都放在一个类中几乎反对OO设计的任何原则. 解决方法
首先,您不需要参数化SQ<%Seq [S].将方法参数写为Seq [S].如果SQ<%Seq [S],那么它的任何实例可以隐式转换为Seq [S](这就是<%意思),所以当作为Seq [S]传递时,编译器将自动插入转换. 另外,Jorge对D的类型参数说了什么,并且使其成为DFA保留的一种方法.由于内部课程在Scala中工作的方式,我强烈建议将runDFA放在DFA上.直到路径依赖键入工具,处理某些外部类的内部类可能会有点痛苦. 所以现在你有
trait DFA[S]{ ... def runDFA(seq : Seq[S]) = ... } 而runDFA是一个突然而简单的推断类型参数:它没有任何. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |