Diuji dengan 2.13, tapi saya kira sudah seperti itu sejak 2.12 dan saya belum pernah mengalami masalah seperti ini sebelumnya:

trait Extractor[-X, +Y] {
    def optional :X => Option[Y] = apply

    def apply(x :X) :Option[Y]

    def andThen[Z](extractor :Extractor[Y, Z]) :Extractor[X, Z] = {
        val first = optional; val second = extractor.optional
        Extractor { x :X => first(x).flatMap(second) }
    }

    def andThen[Z](req :Y => Z) :Extractor[X, Z] = {
        val first = optional
        Extractor { x :X => first(x).map(req) }
   }

   def compose[W](extractor :Extractor[W, X]) :Extractor[W, Y] = extractor andThen this

   def compose[W](req :W => X) :Extractor[W, Y] = Extractor(req andThen optional)

}

Scalac memiliki keluhan samar tentang implementasi compose pertama:

Error:(44, 31) type mismatch;
found   : net.noresttherein.oldsql.morsels.Extractor[X,Y]
required: W => ?
def compose[W](extractor :Extractor[W, X]) :Extractor[W, Y] = extractor andThen this

Mengomentari varian andThen mengambil fungsi memecahkan masalah. Begitu juga mengubah kode menjadi extractor.andThen[Y](this) (parameter tipe eksplisit adalah kuncinya di sini). Dugaan saya adalah entah bagaimana tipe SAM saya dipromosikan ke suatu fungsi, tetapi saya tidak dapat menebak mengapa itu lebih diutamakan daripada suatu metode. Seperti yang saya berikan di sini dua 'solusi', saya tidak mencari banyak solusi, tetapi untuk memahami apa yang terjadi. Ini pertama kalinya dalam beberapa tahun saya tidak mengerti apa yang terjadi dan ingin menghilangkan masalah serupa di masa depan.

2
Turin 14 Maret 2020, 00:42

1 menjawab

Jawaban Terbaik

Mungkin, Anda melanggar aturan baru untuk resolusi kelebihan beban, yang dirancang untuk membantu inferensi jenis.

Pertanyaannya adalah apa "tipe yang diharapkan" dari argumen di extractor.andThen(this).

"Intuisi untuk inferensi tipe parameter fungsi tingkat tinggi adalah bahwa semua argumen harus bertipe seperti fungsi."

Jadi menghapus metode apply merusak kondisi itu dan memungkinkan pengetikan dilanjutkan.

Spesifikasi menambahkan: "Tujuannya bukan untuk mengarahkan resolusi kelebihan beban."

Seharusnya berbunyi: "Tujuannya bukan untuk merusak resolusi kelebihan beban."

Saya kira niat baik membuka banyak jalan.

Sunting: ini berfungsi di 2.12 tanpa aturan yang diubah. Di bawah sistem lama, tidak ada tipe yang diharapkan jika metode kelebihan beban.

Layak ditambahkan bahwa itu mungkin memenuhi syarat sebagai regresi. Misalnya, mereka dapat melakukan pemeriksaan tipe mundur di bawah aturan sebelumnya.

Ini tiket untuk itu.

4
som-snytt 13 Maret 2020, 23:59