gpt4 book ai didi

scala - HList 的无形状类型推断不起作用

转载 作者:行者123 更新时间:2023-12-04 23:03:50 28 4
gpt4 key购买 nike

我正在尝试实现获取第一个元素的通用函数:

import shapeless.ops.hlist.IsHCons
import shapeless.{Generic, HList}

object App {

def main(args : Array[String]) {
val a: Int = getFirst((1, 2, 3))
val b: String = getFirst(("a", "b", 10, 45, "aaa"))
}

def getFirst[A, Head, Repr <: HList, Tail <: HList](input: A)
(implicit hcons: IsHCons.Aux[Repr, Head, Tail],
gen: Generic.Aux[A, Repr]): Head = gen.to(input).head
}

问题是编译器无法正确推断 ReprTail 并将它们设置为 Nothing。这是它:

Error:(9, 26) could not find implicit value for parameter gen: shapeless.Generic.Aux[(Int, Int, Int),Repr]
val a: Int = getFirst((1, 2, 3))
Error:(9, 26) not enough arguments for method getFirst: (implicit hcons: shapeless.ops.hlist.IsHCons.Aux[Nothing :: Nothing,Head,Tail], implicit gen: shapeless.Generic.Aux[(Int, Int, Int),Nothing :: Nothing])Head.
Unspecified value parameter gen.
val a: Int = getFirst((1, 2, 3))
Error:(10, 29) could not find implicit value for parameter gen: shapeless.Generic.Aux[(String, String, Int),Repr]
val b: String = getFirst(("a", "b", 10))
Error:(10, 29) not enough arguments for method getFirst: (implicit hcons: shapeless.ops.hlist.IsHCons.Aux[Nothing :: Nothing,Head,Tail], implicit gen: shapeless.Generic.Aux[(String, String, Int),Nothing :: Nothing])Head.
Unspecified value parameter gen.
val b: String = getFirst(("a", "b", 10))

有什么解决方案可以解决这个问题?以下内容肯定可以正常工作:

val a: Int = getFirst[(Int, Int, Int), Int, Int :: Int :: Int :: HNil, Int :: Int :: HNil]((1, 2, 3))

但这非常麻烦且丑陋。

最佳答案

解决方案是交换隐式参数顺序 - 首先是 Generic,其次是 IsHCons

  def getFirst[A, Head, Repr <: HList, Tail <: HList](input: A)
(implicit gen: Generic.Aux[A, Repr], hcons: IsHCons.Aux[Repr, Head, Tail]
): Head = gen.to(input).head

(scastie)

我不知道它到底是如何工作的,但我已经看到通过解析隐式来推断类型参数是从左到右进行的。

因此,根据您的签名,Scala 首先查找 IsHCons.Aux[Repr, Head, Tail],但此时它对 Repr 知之甚少,只是它是一个 HList。它找到一些实例 - 可能是Nothing::HList之类的东西,然后尝试查找Generic.Aux[A, Nothing::HList] (A 是从 input 推断出来的),由于它不是 A 的有效 Generic,因此失败。

关于scala - HList 的无形状类型推断不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59318077/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com