我正在编写一个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) 这不编译,我不明白为什么:
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) 我一直试图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) 我试过了
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) 我正在研究一个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) 我有以下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都可能吗?
谢谢.
我正在尝试转换以下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) 我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) 当然,生成异构列表的笛卡尔积可以在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,但它在去年还没有更新过,而且我不确定它是否是最合适的工具.
我搜索了Hackage,找不到类似下面的东西,但它似乎相当简单和有用.是否有包含各种数据类型的库?
data HList c where
(:-) :: c a => a -> HList c
Nil :: HList c
Run Code Online (Sandbox Code Playgroud)
我找到的所有HLists都可以有任何类型,并且不受约束.
如果没有我会上传我自己的.