내가 이렇게 내 parse
기능을 사용하기위한 일반 대수 데이터 형식을 정의하려면 :일반 대수 데이터 형식에서 멤버 형식에 'T'가 필요한 이유는 무엇입니까?
sealed class Result<T> {
class Success(val value: T, val pos: Int) : Result<T>()
class Failure(val message: String, val pos: Int) : Result<T>()
}
fun <T> parse(t: Parser<T>, input: String, initialPos: Int = 0, collectErrors: Boolean = true) : Result<T> {
그러나이 T
으로 허용되지 않습니다 다음 정의되지 않은 참조입니다.
나는 그것이 작동하는 모든 구성원 유형에 T
를 추가하는 경우 : 나 여기에
sealed class Result<T> {
class Success<T>(val value: T, val pos: Int) : Result<T>()
class Failure<T>(val message: String, val pos: Int) : Result<T>()
}
날 내가 여기서 뭔가를 놓치고 생각하게하는 다소 혼란이다. 첫 번째 경우에 멤버 유형을 정의 할 때 T
이 표시되지 않는 이유는 무엇입니까? 내가 기대 Success
의 인스턴스를 생성 또한
이 구문은하기 :
Result<T>.Success<T>(tv.someValue, pos)
하지만 그 대신 작동하지 않습니다 내가 할이 :
이Result.Success<T>(tv.someValue, pos)
이것은 바람직 구문 나에게 나는 왜 내가 여기에 결과에 T
을 남겨둬야하는지 이해하기 위해 고투하고있다.
감사합니다. 'Result'는 엄격하게 generic 일 필요는 없지만,'parse'는'Success' generic 타입이'Parser '와 같은'Result'를 만들어내는 것을 좋아합니다. 결과 I에 'T'를 포함하지 않으면 실수로 API가 유형 안전성이 떨어질 것이라고 생각합니다. –
FuleSnabel
'fun foo() : Result'와 같은 메소드 서명을 원한다면? 그래서 반환 값은 성공 또는 실패입니까? –
miguel