标签: hlist

如何在Haskell中连接幻像类型中的元组?

我正在编写一个SQL组合器,它允许将SQL片段组成一个Monoid.我有一个这样的类型(这是一个简化的实现):

data SQLFragment = { selects :: [String], froms :[String], wheres :: [String]}

instance Monoid SQL Fragment where ...
Run Code Online (Sandbox Code Playgroud)

这允许我轻松地结合我经常使用的SQL,并执行以下操作:

email = select "email" <> from "user" 
name  = select "name" <> from "user"
administrators = from "user" <> where_ "isAdmin = 1"

toSql $ email <> name <> administrators
=> "SELECT email, name FROM user WHERE isAdmin = 1"
Run Code Online (Sandbox Code Playgroud)

这非常有效,我很满意.现在我使用MySQL.Simple并执行它需要知道行的类型.

main = do
       conn <- SQL.connect connectInfo
       rows <- SQL.query_ conn $ toSql (email <> name <> …
Run Code Online (Sandbox Code Playgroud)

haskell hlist

6
推荐指数
1
解决办法
334
查看次数

为什么映射Option [T]的HList不起作用?

这不编译,我不明白为什么:

import shapeless._
import poly._

object option extends (Option ~> List) {
    def apply[T](t: Option[T]) = t.toList
}

val simple = Some(1) :: Some("hello") :: Some(true) :: HNil
val opts: List[Int] :: List[String] :: List[Boolean] :: HNil = simple map option
Run Code Online (Sandbox Code Playgroud)

这有点令人惊讶,因为这确实编译:

import shapeless._
import poly._

object choose extends (Set ~> Option) {
    def apply[T](s: Set[T]) = s.headOption
}

val sets = Set(1) :: Set("foo") :: HNil
val opts: Option[Int] :: Option[String] :: HNil = sets map choose
Run Code Online (Sandbox Code Playgroud)

mapping scala hlist shapeless

6
推荐指数
1
解决办法
165
查看次数

映射无形HList的类型

我一直试图HList从scala的shapeless包中映射一个类型,而无需访问它们的值.

以下成功映射HList的值

import shapeless._
import shapeless.Poly._
import ops.hlist.Mapper
import ops.hlist.Mapper._

trait Person {
  type Value
  val v : Value
}

case class StringPerson extends Person {
  type Value = String
  val v = "I like strings"
}

case class IntPerson extends Person {
  type Value = Int 
  val v = 42
}

object what_is_going_on {

  object test_value_op {
    val stringPerson = StringPerson()
    val intPerson = IntPerson()

    trait lpvfun extends Poly1 {
      implicit def default[A <: Person] …
Run Code Online (Sandbox Code Playgroud)

types scala hlist shapeless

6
推荐指数
1
解决办法
719
查看次数

Haskell:显示Hlist上"可显示"的所有元素

我试过了

map show . mapMaybe fromDynamic $ [toDyn "one", toDyn (\x -> x::Integer), toDyn 3, toDyn ()]
Run Code Online (Sandbox Code Playgroud)

但它回来了

["()"]
Run Code Online (Sandbox Code Playgroud)

reflection haskell hlist

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

使用通用函数在异构数据结构上进行映射

我正在研究一个HList实现,我不得不尝试map为它实现一个函数.我已经尝试了很多不同的方法,但是每个方法都会遇到与该函数相关的编译器错误.

以下是我希望如何使用泛型函数Just将其应用于输入数据结构的所有元素的示例.

{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE FlexibleInstances #-}

-- | An input heterogenous data structure
recursivePairs :: (Int, (Char, (Bool, ())))
recursivePairs = (1, ('a', (True, ())))

-- | This is how I want to use it
recursivePairs' :: (Maybe Int, (Maybe Char, (Maybe Bool, ())))
recursivePairs' = hMap Just recursivePairs

class HMap f input output where
  hMap :: f -> input -> output

-- | A counterpart of a Nil pattern match for …
Run Code Online (Sandbox Code Playgroud)

haskell hlist

5
推荐指数
1
解决办法
273
查看次数

scala - HList的通用解压缩

我有以下Scala问题:

编写一个将采用HList列表的函数

List(23 :: “a” :: 1.0d :: HNil, 24 :: “b” :: 2.0d :: HNil)    # this is list of hlists
Run Code Online (Sandbox Code Playgroud)

并返回列表的HList

List[Int](23, 24) :: List[String](“a”, “b") :: List[Double](1.0d, 2.0d) :: HNil # this is hlist of lists
Run Code Online (Sandbox Code Playgroud)

这有点像通用的unzipN.任意HList都可能吗?

谢谢.

scala hlist shapeless

5
推荐指数
1
解决办法
355
查看次数

用于无形Hlist的通用Poly2文件夹案例

我正在尝试转换以下HList

Some(C(15)) :: None :: Some(B(55)) :: None :: Some(A(195)) :: HNil
Run Code Online (Sandbox Code Playgroud)

C(15) :: B(55) :: A(195) :: HNil
Run Code Online (Sandbox Code Playgroud)

这就是我现在所拥有的:

  import shapeless._
  case class A(value: Int)
  case class B(value: Int)
  case class C(value: Int)

  trait folderLP extends Poly2 {
    implicit def default[T, L <: HList] = at[T, L]((acc, t) => acc)
  }
  object folder extends folderLP {
    implicit def none[T, L <: HList] = at[None.type, L]((t, acc) => acc)

    implicit def someDiameter[T, L <: HList] = at[Some[C], L]((t, acc) …
Run Code Online (Sandbox Code Playgroud)

generics scala fold hlist shapeless

5
推荐指数
1
解决办法
1009
查看次数

将Shapeless HList转换为元组

try-with-resources在Scala中有这个版本。我想知道是否可以使用Shapeless和HList制作通用版本?

import scala.util.{Failure, Success, Try}

class Loan1[A <: AutoCloseable](resource: A) {
  def to[B](block: A => B): B = {
    Try(block(resource)) match {
      case Success(result) =>
        resource.close()
        result
      case Failure(e) =>
        resource.close()
        throw e
    }
  }
}

class Loan2[A <: AutoCloseable, B <: AutoCloseable](r1: A, r2: B){
  def to[R](block: (A,B) => R): R = {
    Try(block(r1,r2)) match {
      case Success(result) =>
        r1.close(); r2.close()
        result
      case Failure(e) =>
        r1.close(); r2.close()
        throw e
    }
  }
}

object Loan {

  def apply[A …
Run Code Online (Sandbox Code Playgroud)

scala hlist shapeless

5
推荐指数
1
解决办法
785
查看次数

异构列表的笛卡尔积

当然,生成异构列表的笛卡尔积可以在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
查看次数

受约束的异构列表

我搜索了Hackage,找不到类似下面的东西,但它似乎相当简单和有用.是否有包含各种数据类型的库?

data HList c where
  (:-) :: c a => a -> HList c
  Nil :: HList c
Run Code Online (Sandbox Code Playgroud)

我找到的所有HLists都可以有任何类型,并且不受约束.

如果没有我会上传我自己的.

haskell types hlist constraint-kinds

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

标签 统计

hlist ×10

haskell ×5

scala ×5

shapeless ×5

types ×3

constraint-kinds ×1

fold ×1

generics ×1

ghc ×1

mapping ×1

reflection ×1