我有这种情况(剥离到必要部分)
class Foo[L <: HList](columns: L) {
class toRecord(row: Row) extends Poly1 {
implicit def caseColumn[T] = at[Column[T]] { /* map to a record field */ }
}
def asRecord = {
val resultSet: Stream[Row] = // computation to get result set
resultSet.map { row =>
val m = new toRecord(row) // this can't work
columns.map(m)
}
}
}
Run Code Online (Sandbox Code Playgroud)
这不起作用,因为map想要一个稳定的标识符,m而不是.所以我需要Poly1 singleton objects在结果集中有多少行.
这是与此处讨论的问题相同的问题:https://groups.google.com/forum/#!topic /shapeless-dev/P5DXRgnzqkY,但我无法找到使其工作的方法.
在链接的讨论中,Miles Sabin提出了folda Poly2而不是a …
我有一个HList,其中每列代表一个表的列.HList中的每个列表具有相同的长度.
我希望能够编写一个函数,将该表的各行选取为元组或值的HList.最终我会把它转换成更合理的东西(例如Case Case).
import shapeless.PolyDefns.~>
import shapeless.{HList, HNil}
val a = List(1,2,3) :: List("a", "b", "c") :: List(true, false, true) :: HNil
object broken extends (HList ~> HList) {
def apply[T](n:Int, l:HList): HList = {
// I want to pick out the nth element of each HList
// so in the above example, if n==1
// I want to return
// 2 :: "b" :: false :: HNil
???
}
}
broken(1,a)
Run Code Online (Sandbox Code Playgroud)
我可以修复此功能,以便它根据我在评论中描述的内容工作吗?
加分点:我可以将其写为迭代器,将上面的HList"a"转换为(Int,String,Boolean)或等效HList的序列吗?
当然,生成异构列表的笛卡尔积可以在Haskell中以多种方式完成,例如:
[(x,y) | x <- [1,2,3], y <- [4,5,6]]
Run Code Online (Sandbox Code Playgroud)
要么
(,) <$> [1,2,3] <*> [4,5,6]
Run Code Online (Sandbox Code Playgroud)
但我想要的是这样的功能:
heteroCartesian ::
(a1, a2, ... , an) ->
(b1, b2, ... , bn) ->
((a1,b1), (a1,b2), ... , (a1,bn), (a2,b1), (a2,b2), ... , (a2,bn), (an,b1), ... ,(an,b2), ... , (an,bn))
Run Code Online (Sandbox Code Playgroud)
所以我可以这样做:
f (1,'a',True) (2,'b') ==
((1,2),(1,'b'),('a',2),('a','b'),(True,2),(True,'b'))
Run Code Online (Sandbox Code Playgroud)
我不介意我是使用元组还是其他东西,但我需要像上面一样保留类型信息.
我想要这个的原因是创建测试用例.我有一堆说n功能和m价值观.最终我会将一个函数映射到这些函数上,这些函数将它们全部缩减为相同的类型(a Test)但是到目前为止,n*m我想要执行的测试用例有很多不同的类型(实际上并不是那么简单,因为某些函数只能受限制值的子集).
所以很自然地,将这些异构列表用于其他函数是很好的,例如某些类型map.
我已经看过HList,但它在去年还没有更新过,而且我不确定它是否是最合适的工具.