相关疑难解决方法(0)

在无形状中动态参数化Poly1函数

我有这种情况(剥离到必要部分)

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 …

scala shapeless polymorphic-functions

7
推荐指数
1
解决办法
597
查看次数

选取Lists的HList的第N个元素,并将该值作为值的HList返回

我有一个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的序列吗?

scala shapeless

7
推荐指数
1
解决办法
352
查看次数

异构列表的笛卡尔积

当然,生成异构列表的笛卡尔积可以在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,但它在去年还没有更新过,而且我不确定它是否是最合适的工具.

haskell types ghc hlist

5
推荐指数
2
解决办法
120
查看次数

标签 统计

scala ×2

shapeless ×2

ghc ×1

haskell ×1

hlist ×1

polymorphic-functions ×1

types ×1