- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
很容易按类型过滤无形状的 HList
:
val hlist = 1 :: 2 :: "3" :: true :: false :: HNil
hlist.filter[Int]
但是我怎样才能制作我的自定义类型过滤器呢?我想要这样的东西:例如我得到了一些函数的列表:
def function1(s: String) = s.toInt
def function2(s: String) = s.toDouble
def function3(i: Int) = i.toDouble
val hflist = function1 _ :: function3 _ :: function2 _ :: HNil
hflist customFilter[String] //> function1 _ :: function2 _ :: HNil
因此,使用此过滤器后,将构造从 String
类型到其他类型的函数列表。
我有一个想法,使用 map 来实现此目的,但没有成功。
版本
有关我的评论的更多信息:
我尝试在 map 中测试这个想法:
因此,如果我有一些列表(让我们使用 hlist
和 hflist
进行操作):
object allFunction extends Poly1 {
implicit def default[T, M] =
at[T => M](t => {
object grabStringFunc extends skip {
implicit def stringFunc[A] = at[T => A](_ :: HNil)
}
println(hflist flatMap grabStringFunc) //> here we should see result, list of functions
})
hlist map allFunction
//> result of this should be smth like (types)
//> shapeless.::[Int => Double,shapeless.HNil]]
//> shapeless.::[Int => Double,shapeless.HNil]]
//> shapeless.::[String => Int,shapeless.::[String => Double,shapeless.HNil]]
//> shapeless.HNil
//> shapeless.HNil
非常有趣,为什么它编译和运行不正确?我认为这是行不通的,因为对象不能以这种方式接受类型参数......
最佳答案
最简单的方法是使用折叠。首先,我们需要一个多态函数,如果每个项目具有所需的类型(对于某些 A
来说,String => A
),它将把每个项目添加到累加器中,否则忽略它:
trait ignore extends Poly2 {
implicit def default[A, L <: HList] = at[A, L]((_, l) => l)
}
object keepStringFunc extends ignore {
implicit def stringFunc[A, L <: HList] = at[String => A, L](_ :: _)
}
现在,以下内容将在 1.2.4 和 2.0.0-M1 中给出您想要的结果:
val filtered = hflist.foldRight(HNil)(keepStringFunc)
您还可以在 Filter
、FilterAux
(或 Filter.Aux
)等模型上编写自己的类型类 - 并且如果您想掌握 Shapeless 的窍门,这样做将是一个很好的练习,但 foldRight
要简单得多。
更新:实际上,就其值(value)而言,有一种稍微更简洁的方法可以使用 flatMap
来实现此目的:
trait skip extends Poly1 {
implicit def default[A] = at[A](_ => HNil)
}
object grabStringFunc extends skip {
implicit def stringFunc[A] = at[String => A](_ :: HNil)
}
val filtered = hflist flatMap grabStringFunc
我个人认为 foldRight
版本更明显一点,但这个版本也非常优雅。
回应您的评论:您可以使解决方案更加通用,如下所示:
trait skip extends Poly1 {
implicit def default[A] = at[A](_ => HNil)
}
trait grabFuncFrom[T] extends skip {
implicit def stringFunc[A] = at[T => A](_ :: HNil)
}
object grabStringFunc extends grabFuncFrom[String]
val filtered = hflist flatMap grabStringFunc
但是您仍然需要最后一步,将更高等级的函数创建为对象(例如,请参阅 this answer 和 Miles 的评论,以了解有关此问题的一些讨论)。
关于list - Shapeless、Scala 中的过滤器使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19893633/
有 (Some(1), 2, Some(3)) 我希望得到 (Some(1), Some(2), Some(3)) 使用无定形可以做到吗? 最佳答案 是的,无形可以做很多事情! import sh
我正在开发一个用于经济模型的小型库,用于检查实体的单位,使用类型,例如而不是 val apples = 2.0我们写 val apples = GoodsAmount[KG, Apples](2.0)
据我了解,依赖类型允许您不指定输出类型: 例如,如果您有一个类型类: trait Last[In] { type Out } 然后你可以在不指定输出类型的情况下召唤一个实例: implicitly
我正在考虑做类似 Safely copying fields between case classes of different types 的事情但字段重新排序,即 case class A(foo
一旦出现类型参数,shapeless 中的类型不等式似乎就不安全了。 例如下面的代码编译 def someMethod[T](in : T) = { implicitly[T =:!= Strin
我仍在努力了解 Shapeless(在较小程度上,Scala!)并且我一直在编写一些简单的代码来为案例类生成随机实例数据 - 主要基于此处的指南:http://enear.github.io/2016
shapeless 是否提供了一个类型类/宏来调用一个 HList,其中包含一个 case 类的所有参数的默认值? 假设我们有这个案例类: case class User(name: String,
Shapeless 有一个整洁的类型类 derivation mechanism它允许您定义类型类并获得任何类型类的自动派生。 要使用派生机制作为类型类的用户,您将使用以下语法 import MyTy
昨天我和几个同事在探索Shapeless,我们决定写一个玩具方法来向case类的第一个参数添加一个,当该参数是Int时。 : def addOneToCaseClass[C, H <: HList,
给定一组具有两个不同子集的 Adt 例如: sealed trait Domain[Y] sealed trait Command[Y] extends Domain[Y] sealed trait
给定一个案例类 A我可以使用以下代码段使用 Shapeless 提取其字段名称: val fieldNames: List[String] = { import shapeless._ imp
假设我有几个功能: val f1: Int => String val f2: (Int, Int) => String val f3: (Int, Int, Int) => String def f
鉴于我的类型为 Int :+: Int :+: String :+: CNil , 有没有简单的方法把它变成Int :+: String :+: CNil ? 最佳答案 这取决于您所说的“容易”是什么
在我正在开发的 Play 应用程序中,我正在尝试改进我们处理标志的系统,其中一些是当用户通过链接导航我们的应用程序时的持久选项。我想使用 Shapeless 将选项的定义映射到它的值,并仅从标记为要传
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 7 年前。 Improve this ques
我可以编写一个简单的递归多态函数: object simpleRec extends Poly1 { implicit def caseInt = at[Int](identity) impl
我想将一个类的更新实例合并到一个基本实例中,如果该字段在基本实例中为“空”,则选择更新实例的字段而不是基本实例。下面的示例合并了 base 和 update: case class Foo(a: Op
很容易按类型过滤无形状的 HList: val hlist = 1 :: 2 :: "3" :: true :: false :: HNil hlist.filter[Int] 但是我怎样才能制作我的
是否可以使用 shapeless 将 1 个对象转换为另一个对象 做一些小的转换,比如将 Option[T] 转换为 T (无需为每个类手动定义映射) 忽略缺失的字段 进口无形。_ 导入 shapel
有谁知道如何使用 Shapeless 进行此测试。 package net.jtownson.swakka.jsonschema import org.scalatest.FlatSpec impor
我是一名优秀的程序员,十分优秀!