簡體   English   中英

Scala 2.12:通用量化的SAM特征相當於Java 8方法參考?

[英]Scala 2.12: What is the equivalent of Java 8 method reference for universally quantified SAM trait?

我的目標是通過新的scala 2.12支持SAM(單一抽象方法)特征來實現代數數據類型(教會編碼)的單例值。

在Java中,以下程序返回true

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".
  }
}

我試圖將此編碼移植到scala 2.12,但無法編譯:

@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))

我的目標是讓scalac觸發Javac所做的相同優化,使Java程序打印為“ true”。 只要不使用asInstanceOfNothing / variance注釋,我對滿足scalac所需的任何條件都持開放asInstanceOf

編輯 :由於當前不支持此功能 ,因此我在scala問題跟蹤器上為此打開了一個功能請求 (請投票!;-)。

不幸的是,根據規范是不允許

它遵循:

  • 如果類C定義了構造函數,則它必須是可訪問的,並且必須精確地定義一個空的參數列表;

  • m不能是多態的

  • 必須有可能通過推斷C的任何未知類型參數來從S導出完全定義的類型U。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM