Scala 定义不成形替换程序

Scala 定义不成形替换程序,scala,shapeless,Scala,Shapeless,我想知道如何使用Shapeless库修复此Scala代码,以便它编译: 对象boo{ 进口不成形_ 密封毕比 案例类LittleBibby(i:Int)扩展了Bibby case类bigbby(s:String)扩展了Bibby 类型Bibbies=littlebby::bigbby::HNil val defaultBibbies:Bibbies=LittleBibby(1)::Bigbby(“嘟嘟”)::HNil def更新(b:Bibby,bibbies:bibbies):bibbies=

我想知道如何使用Shapeless库修复此Scala代码,以便它编译:

对象boo{
进口不成形_
密封毕比
案例类LittleBibby(i:Int)扩展了Bibby
case类bigbby(s:String)扩展了Bibby
类型Bibbies=littlebby::bigbby::HNil
val defaultBibbies:Bibbies=LittleBibby(1)::Bigbby(“嘟嘟”)::HNil
def更新(b:Bibby,bibbies:bibbies):bibbies=bibbies.updatedElem(b)
val demo:Bibbies=更新(LittleBibby(3),默认Bibbies)
}
我收到以下错误消息:

could not find implicit value for parameter replacer:shapeless.Replacer[boo.Bibbies,boo.Bibby,boo.Bibby]
def update(b: Bibby, bibbies: Bibbies) : Bibbies = bibbies.updatedElem(b)
我试图通过查看不成形的源代码来找到创建缺少的隐式替换程序的解决方案,但没有成功://

您放弃了关于bibby是小bibby还是大bibby的信息:

def update(b: Bibby, bibbies: Bibbies) : Bibbies
我不知道这是否足够,但我首先要保留bibby类型:

def update[T <: Bibby](b: T, bibbies: Bibbies) : Bibbies
您放弃了关于bibby是小bibby还是大bibby的信息:

def update(b: Bibby, bibbies: Bibbies) : Bibbies
我不知道这是否足够,但我首先要保留bibby类型:

def update[T <: Bibby](b: T, bibbies: Bibbies) : Bibbies

对于
shapeless.Replacer
,有关实际元素类型的信息应在编译时可用。
Bibbies
中没有类型为
Bibby
的元素,因此没有可替换的元素

您应该为
b
使用泛型类型,还应该添加必需的
Replacer[Bibbies,b,b]
作为隐式参数,如下所示:

def update[B <: Bibby](b: B, bibbies: Bibbies)(implicit r: Replacer[Bibbies, B, B]) =
  bibbies.updatedElem(b)

update(LittleBibby(3), defaultBibbies)
// LittleBibby(3) :: BigBibby(beep) :: HNil

def update[BFor
shapeless.Replacer
有关实际元素类型的信息应在编译时可用。
Bibbies
中没有类型为
Bibby
的元素,因此没有可替换的内容

您应该为
b
使用泛型类型,还应该添加必需的
Replacer[Bibbies,b,b]
作为隐式参数,如下所示:

def update[B <: Bibby](b: B, bibbies: Bibbies)(implicit r: Replacer[Bibbies, B, B]) =
  bibbies.updatedElem(b)

update(LittleBibby(3), defaultBibbies)
// LittleBibby(3) :: BigBibby(beep) :: HNil

def update[B实际上所有必需的信息都在错误消息中:
对于参数replacer:shapeless.replacer[boo.Bibbies,boo.Bibby,boo.Bibby]
@senia是的,但我只是在重新格式化错误消息时才意识到。@DanielC.Sobral-这意味着如果我在演员的接收中使用update,我需要类似于(无论如何):
def update:(Bibby⇒ Bibbies)={案例lb:Littlebbby⇒ 更新(lb,defaultBibbies)案例bb:Bigbby⇒ 更新(bb,defaultBibbies)}
@DanielC.Sobral-用例类似于:
def updated:((Bibby,Bibbies)⇒ 双曲线)=(b,bs)⇒ b匹配{case lb:littlebby⇒ 更新(lb,bs)案例bb:Bigbby⇒ 更新(bb,bs)}
我有一些工人演员被要求做一些工作,每个人都用一个
比比的实例来响应-因此我从
默认比比开始,并使用
上下文。成为
我可以发出请求,并最终建立一个
比比
的结果,然后交给发起的主演员。@ahjohannessen非常喜欢。actor会删除类型信息,因此它们与强类型代码(如shapeble)不一致,后者依赖于可在编译时确定的类型。实际上,所有必需的信息都在错误消息中:
对于参数replacer:shapeble.replacer[boo.Bibbies,boo.Bibby,boo.Bibby]
@senia是的,但我只是在重新格式化错误消息时才意识到。@DanielC.Sobral-这意味着如果我在演员的接收中使用update,我需要类似于(无论如何):
def update:(Bibby⇒ Bibbies)={案例lb:Littlebbby⇒ 更新(lb,defaultBibbies)案例bb:Bigbby⇒ 更新(bb,defaultBibbies)}
@DanielC.Sobral-用例类似于:
def updated:((Bibby,Bibbies)⇒ 双曲线)=(b,bs)⇒ b匹配{case lb:littlebby⇒ 更新(lb,bs)案例bb:Bigbby⇒ 更新(bb,bs)}
我有一些工人演员被要求做一些工作,每个人都用一个
比比的实例来响应-因此我从
默认比比开始,并使用
上下文。成为
我可以发出请求,并最终建立一个
比比
的结果,然后交给发起的主演员。@a演员删除类型信息,因此他们与强类型代码(如Shapess)不一致,后者依赖于可在编译时确定的类型。