gpt4 book ai didi

scala - 如何操作 Poly1 中的 FieldTypes?

转载 作者:行者123 更新时间:2023-12-01 13:50:28 26 4
gpt4 key购买 nike

我想在 Labeled Generics 上使用来自 shapeless contrib (+scalaz) 的序列,但首先我需要映射到 FieldTypes。

是否可以在该示例中创建缺少的 f 函数?

object TestLabelledGeneric {

import shapeless._

import singleton._


val a = "name" ->> Option("hello") :: "y" ->> Option(1) :: HNil

val b = Option("name" ->> "hello") :: Option("y" ->> 1) :: HNil

val f = ???

val name = Witness('name); val age = Witness('age)

def assertTypedEquals[A](expected: A, actual: A): Unit = assert(expected == actual)

assertTypedEquals[b.type](b, a.map(f))


}

已解决,谢谢@travis-brown!

这是在我的机器上运行的版本:

object TestLabelledGeneric {

import shapeless._

import singleton._

val a = "name" ->> Option("hello") :: "y" ->> Option(1) :: HNil

val b = Option("name" ->> "hello") :: Option("y" ->> 1) :: HNil

import labelled.{ FieldType, field }

object f extends Poly1 {
implicit def kv[K, V]: Case.Aux[
FieldType[K, Option[V]],
Option[FieldType[K, V]]
] =
at(_.map(field[K](_)))
}

// If I try to use Witness.`"name"`.T directly in Res, I have a "not accessible type" error
val name = Witness.`"name"`
val y = Witness.`"y"`
type Res = Option[FieldType[name.T, String]] :: Option[FieldType[y.T ,Int]] :: HNil

def assertTypedEquals[A](expected: A, actual: A): Unit = assert(expected == actual)

assertTypedEquals[Res](b, a.map(f))
}

最佳答案

您想将 FieldType[K, Option[V]] 转换为 Option[FieldType[K, V]]FieldType[K, Option[V]]Option[V] 的子类型,您可以将 V 变成 FieldType[K, V]shapeless.labelled.field

然后你可以把这个操作放到一个Poly1中:

import shapeless._, labelled.{ FieldType, field }, syntax.singleton._

object f extends Poly1 {
implicit def kv[K, V]: Case.Aux[
FieldType[K, Option[V]],
Option[FieldType[K, V]]
] =
at(_.map(field[K](_)))
}

这并不能满足您的需求,因为 a.map(f) 的类型不是 b.type(这是单例类型对于 b)。不过,您可以确认它确实做了您想要的:

scala> type Res =
| Option[FieldType[Witness.`"name"`.T, String]] ::
| Option[FieldType[Witness.`"y"`.T, Int]] :: HNil
defined type alias Res

scala> assertTypedEquals[Res](b, a.map(f))

是的,它们是一样的。

关于scala - 如何操作 Poly1 中的 FieldTypes?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32150975/

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