2016-09-06 13 views
4

내 목표는 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을 열었습니다 (투표하십시오!).

+0

당신은 빈의 정의를 교체하면 어떻게됩니까 : 는'데프 비우 [A] : 어쩌면 [A] = empty0'? scala 2.12가 설치되어 있지 않고 유효한 응답인지 실제로 확인할 수 없습니다. –

+0

그러면'Error : (11, 33) polymorphic 표현식을 예상되는 유형으로 인스턴스화 할 수 없습니다. [...] 객체의 empty0 메소드에 대한 인수 목록 누락 가능 적용되지 않은 메소드는 함수 유형이 예상 될 때만 함수로 변환됩니다. "empty0"대신 "empty0 _"또는 "empty0 (_, _)"을 쓰면이 변환을 명시 적으로 만들 수 있습니다. def empty [A] : 아마도 [A] = empty0;' – JbGi

+0

당신은 인자가 어디에 위치하는지 명시 적으로 지정하는 대신에 컴파일러가 이것을 연결하도록하려고한다는 것을 의미합니까? –

답변

3

불행하게도, 그것은 the specification에 따라 허용하지 않는다 :

It follows that:

  • if class C defines a constructor, it must be accessible and must define exactly one, empty, argument list;

  • m cannot be polymorphic;

  • it must be possible to derive a fully-defined type U from S by inferring any unknown type parameters of C.

+0

이 기능 요청은 https://issues.scala-lang.org/browse/SI-9916 –

+0

에서 열었습니다. 예, Alexey의 답변을받은 후 열었습니다. 질문에 대한 링크 추가. – JbGi