내 목표는 SAM (단일 추상 메서드) 특성의 새로운 scala 2.12 지원을 통해 대수 데이터 형식 (교회 인코딩)의 싱글 톤 값을 구현하는 것입니다. 내가 스칼라 2.12에 포트에이 인코딩을 시도했지만이 컴파일되지 않습니다 스칼라 2.12 : 보편적으로 정량화 된 SAM 특성에 대한 Java 8 메소드 참조와 같은 기능을합니까?
import java.util.function.Function;
import java.util.function.Supplier;
@FunctionalInterface
public interface Maybe<A> {
<X> X fold(Supplier<X> empty, Function<A, X> just);
static <A, X> X empty0(Supplier<X> empty, Function<A, X> just) {
return empty.get();
}
static <A> Maybe<A> empty() {
return Maybe::empty0;
}
static void main(String[] args) {
Maybe<?> emptyString = Maybe.<String>empty();
Maybe<?> emptyInt = Maybe.<Integer>empty();
System.out.println(emptyString == emptyInt); // print "true".
}
}
:
@FunctionalInterface
trait Maybe[A] {
def fold[X](empty: => X, just: A => X): X
}
object Maybe {
def empty0[A, X](empty: => X, just: A => X): X = empty
def empty[A]: Maybe[A] = empty0(_ ,_) // does not compile
def main(args: Array[String]): Unit = {
val emptyString: Maybe[String] = Maybe.empty
val emptyInt: Maybe[Integer] = Maybe.empty
print(emptyString eq emptyInt) // how to make this print "true"???
}
}
내가 오류는 다음과 같습니다 missing parameter type for expanded function ((x$1: <error>, x$2: <error>) => empty0(x$1, x$2))
자바, 다음의 프로그램 리턴 true
에서
내 목표는 자바 progra을 만드는 Javac과 같은 최적화가 scalac을 트리거하는 것이다. m "true"를 인쇄하십시오. 나는 scalac을 만족시키기 위해 필요한 것이면 무엇이든 열어 둔다. asInstanceOf
이나 Nothing
/variance annotation을 사용하지 않는 한.
EDIT : 현재 지원되지 않으므로 feature request on the scala issue tracker을 열었습니다 (투표하십시오!).
당신은 빈의 정의를 교체하면 어떻게됩니까 : 는'데프 비우 [A] : 어쩌면 [A] = empty0'? scala 2.12가 설치되어 있지 않고 유효한 응답인지 실제로 확인할 수 없습니다. –
그러면'Error : (11, 33) polymorphic 표현식을 예상되는 유형으로 인스턴스화 할 수 없습니다. [...] 객체의 empty0 메소드에 대한 인수 목록 누락 가능 적용되지 않은 메소드는 함수 유형이 예상 될 때만 함수로 변환됩니다. "empty0"대신 "empty0 _"또는 "empty0 (_, _)"을 쓰면이 변환을 명시 적으로 만들 수 있습니다. def empty [A] : 아마도 [A] = empty0;' – JbGi
당신은 인자가 어디에 위치하는지 명시 적으로 지정하는 대신에 컴파일러가 이것을 연결하도록하려고한다는 것을 의미합니까? –