스칼라에서 멤버 유형이 어떻게 작동하는지 그리고 유형을 어떻게 연관시켜야하는지 알고 싶습니다.유형 매개 변수 대 스칼라의 멤버 유형
한 가지 방법은 관련 유형을 유형 매개 변수로 만드는 것입니다. 이 접근법의 장점은 유형의 분산을 처방 할 수 있다는 것이고 하위 유형이 유형을 변경하지 않는다는 것을 확신 할 수 있습니다. 단점은 함수의 형식에서 형식 매개 변수를 추론 할 수 없다는 것입니다.
두 번째 방법은 관련된 유형을 두 번째 유형의 멤버로 만드는 것이고 하위 유형의 연결된 유형에 경계를 지정할 수 없으므로 함수 매개 변수에서 유형을 사용할 수 없다는 문제가 있습니다. 구체적인 예로들 수
: (X, X 번호 (T)가 된 xT와 어떤 관련되지 않을 수 있습니다 때 X) :
내가
trait DFA[S] { /* S is the type of the symbols in the alphabet */
trait State { def next(x : S); }
/* final type Sigma = S */
}
(유형 매개 변수없이 수) DFAS에 대한 특성을 가지고
나는 달리기를위한 함수를 만들고 싶다. 이 입력 순서를 통해 DFA, 나는
- 기능이 입력 순서 유형으로 아무것도
<% Seq[alphabet-type-of-the-dfa]
를 수행해야 할 유형 매개 변수를 지정할 필요가 없습니다 함수 호출은 모두 추정해야
- 내가 좋겠 구체적인 DFA 유형으로 호출 할 함수와 같습니다 (그러나 함수가 DFA의 유형 매개 변수를 갖지 않는 솔루션이있는 경우에는 문제가 없습니다.)
- 알파벳 유형은 제약을받지 않아야합니다.
def runDFA[S, D <: DFA[S], SQ <% Seq[S]](d : D)(seq : SQ) = ....
이 작품 : 지금까지 알려지지 않은 사용자 정의 클래스 숯불뿐만 아니라위한 DFA) 다른 알파벳 유형
- DFAS 내가이 시도
하위 유형이없는이 있어야합니다 단, S가 유추되지 않는다는 점을 제외하고는 각 호출 사이트에 전체 유형 매개 변수 목록을 작성해야합니다.
def runDFA[D <: DFA[S] forSome { type S }, SQ <% Seq[D#Sigma]](... same as above
이 나는 또한, 유형 매개 변수를 삭제 추상적 인 유형 시그마를 생성하고 그 유형을 결합 시도
(D를 ??? (무엇입니까?)를 입력하는 잘못된 순환 참조)를 작동하지 않았다 구체적인 수업. runDFA는
def runDFA[D <: DFA, SQ <% Seq[D#Sigma]](... same as above
과 같을 것이다 그러나 이것은 필연적으로 같은 문제로 실행 "형식이 일치 : dfa.Sigma
을 예상, D#Sigma
얻었다"
어떤 아이디어? 포인터?
편집 : 답변으로
가이 일 때문에 변경할 수 누군가가 왜 불가능하다 더에 정교한 수있는 어떤 것,이 일을 더 간단한 방법이없는 표시?
runDFA ro가 무료 함수 (메소드가 아님)가되기를 원하는 이유는 automaton 최소화, 정규 언어 연산, NFA-DFA 변환, 언어 분해 등과 같은 다른 유사한 함수를 원하고 이 한 클래스 안에서는 객체 지향 디자인의 거의 모든 원칙에 위배됩니다.
와우, 나는 당신이 이것을 의미한다고 생각했다 : http://www.huygens-fokker.org/scala/ – MusiGenesis