Các ý chính sau đây có mã cho một ý tưởng tôi đang chơi vớiIssue giải quyết arity của args chức năng để lái xe xử lý danh sách, sử dụng hình thù
package com.test1
import scala.language.implicitConversions
import shapeless._
import FromTraversable._
import Traversables._
import Nat._
import Tuples._
trait ToArity[P, N <: Nat]
object ToArity {
implicit def prod1[P <: Product1[_]] = new ToArity[P, _1] {}
implicit def prod2[P <: Product2[_, _]] = new ToArity[P, _2] {}
// ad nauseum...
}
trait SizedHListAux[A, N <: Nat, T <: HList]
object SizedHListAux {
implicit def base[A, H <: HList] = new SizedHListAux[A, _0, HNil] {}
implicit def induct[A, H <: HList, N <: Nat, P <: Nat](implicit r: PredAux[N,P], k: SizedHListAux[A, P, H]) = new SizedHListAux[A, N, A :: H] {}
}
trait SomeFun {
type Result
def apply(): Result
}
// I want to abstract over A, the contained type in the List
// over P the Product type which is the arg notably its arity
// This means we need to recover arity of the Product type and render it in value space
// and also means that we need to compute the type of the intermediate HList
object SomeFun {
def produce(m: SomeFun): m.Result = m()
implicit def fromF1[T, A, P <: Product, N <: Nat, H <: HList](f1: (P => T, List[A]))(implicit k: ToArity[P, N], toI: ToInt[N], l: SizedHListAux[A, N, H], toHL: FromTraversable[H], tp: TuplerAux[H, P]) =
new SomeFun {
type Result = (T, List[A])
def apply(): Result = {
val (f, as) = f1
val (ts, rest) = (as.take(toI()), as.drop(toI()))
f((toHL(ts).get).tupled) -> rest
}
}
// Debug Arity checker
def printArity[P <: Product, N <: Nat](p: P)(implicit k: ToArity[P, N], toI: ToInt[N]) = println("Arity: " + toI())
}
object Test {
val thedata = List("foo", "bar", "baz", "bob")
val tfn = (x: (String, String)) => println("%s and %s".format(x._1, x._2))
def foo = SomeFun.printArity("a" -> "b")
//def doit = SomeFun.produce((tfn, thedata)) // Adding this line does not compile
}
Ý tưởng là bạn sử dụng arity lập luận của một chức năng, trong trường hợp này arity của một loại sản phẩm, để phân tích cú pháp của một danh sách liên quan [A]. Loại giống như sử dụng băng dính để bóc lớp graphene khỏi graphit, tức là loại chức năng kéo mọi thứ ra khỏi danh sách. Đây chỉ là một phác thảo sử dụng một loại duy nhất, nhưng tôi tưởng tượng nó có thể được khái quát hóa. Khía cạnh quan trọng là bản thân các hàm không biết về xử lý Danh sách.
Tuy nhiên ... khái niệm có vẻ thất bại khi cố gắng giải quyết ToArity [P, N] ngầm định. Ngày ToArity riêng của nó là resolvable bằng chứng là printArity().
Ai đó có thể làm sáng tỏ một số lý do tại sao điều này không thể giải quyết được trong ngữ cảnh của fromF1? Có phải là nó không thể giải quyết tất cả các implicit phụ thuộc và sau đó đăng ký lỗi với đầu tiên, tức là một N không thể được tìm thấy để đáp ứng ToArity, ToInt và SizedHListAux?
AH! Làm cho cảm giác bây giờ, cảm ơn cho các con trỏ về việc sử dụng các thành phần tiêu chuẩn Shapeless ... đã hy vọng tôi có thể gián tiếp thông qua SomeFun để trừu tượng trên các sản phẩm khác nhau() biến thể nhưng bây giờ có vẻ như một bước quá xa. – dconlon