Я ищу способ захватить типы, которые используются во время понимания для самого типа самого понимания. Для этого я указанный грубого интерфейса:Типы захвата и цепочки, используемые для понимания
trait Chain[A]{
type ChainMethod = A => A //type of the method chained so far
def flatMap[B](f: A => Chain[B]): Chain[B] //the ChainMethod needs to be included in the return type somehow
def map[B](f: A => B): Chain[B]: Chain[B]
def fill: ChainMethod //Function has to be uncurried here
}
В качестве примера несколько конкретных типов Chain
:
object StringChain extends Chain[String]
object IntChain extends Chain[Int]
и класс случая, который будет использоваться:
case class User(name:String, age:Int)
цепи может быть создано с пониманием:
val form = for{
name <- StringChain
age <- IntChain
} yield User(name, age)
типа form
должен быть
Chain[User]{type ChainMethod = String => Int => User}
так, что мы можем сделать следующее:
form.fill("John", 25) //should return User("John", 25)
Я попробовал несколько подходов, со структурными типами и специализированной FlatMappedChain
черты, но я не могу получить типа, чтобы вести себя так, как я этого хочу. Мне бы понравились некоторые идеи или предложения о том, как указать интерфейс, чтобы компилятор мог распознать это, если это вообще возможно.