- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试使用 shapeless 创建一个可以采用余积的 poly2 函数:
case class IndexedItem(
item1: Item1,
item2: Item2,
item3: Item3
)
case class Item1(name: Int)
case class Item2()
case class Item3()
object IndexUpdater {
type Indexable = Item1 :+: Item2 :+: Item3 :+: CNil
object updateCopy extends Poly2 {
implicit def caseItem1 = at[IndexedItem, Item1] { (a, b) => a.copy(item1 = b) }
implicit def caseItem2 = at[IndexedItem, Item2] { (a, b) => a.copy(item2 = b) }
implicit def caseItem3 = at[IndexedItem, Item3] { (a, b) => a.copy(item3 = b) }
}
def mergeWithExisting(existing: IndexedItem, item: Indexable): IndexedItem = {
updateCopy(existing, item)
}
}
这给了我一个错误
Error:(48, 15) could not find implicit value for parameter cse: shapeless.poly.Case[samples.IndexUpdater.updateCopy.type,shapeless.::[samples.IndexedItem,shapeless.::[samples.IndexUpdater.Indexable,shapeless.HNil]]] updateCopy(existing, item)
我认为这是有道理的,因为 Poly2 正在处理项目的实例,而不是扩展的副产品类型(即为 Item1
生成隐式变量,而不是 Indexable
>)
但是,如果我不使用 PolyApply 重载来应用 poly2,而是这样做:
def mergeWithExisting(existing: IndexedItem, item: Indexable): IndexedItem = {
item.foldLeft(existing)(updateCopy)
}
然后它就可以工作了。我不确定 Foldleft 正在做什么来解析类型。如果这是公认的方式,我该如何制作这个通用的以便我可以使用 Poly3?还是聚四?
有什么方法可以扩大 Poly 中的类型,使其与 apply 方法一起使用吗?也许我的处理方式是错误的,我愿意接受建议
最佳答案
为了左折叠具有 Poly2
的余积,该函数需要提供类型为 Case.Aux[A, x, A]
的情况,其中 A
是(固定)累加器类型,而 x
是余积中的每个元素。
对于累加器类型 updateCopy
和余积 IndexedItem
,您的 Indexable
正是执行此操作,因此您可以将带有初始值 Indexable
的 IndexedItem
左折叠以获得 IndexedItem
。如果我理解正确的话,这正是您想要的 - updateCopy
中独特的适当情况将应用于初始 IndexedItem
和余积的值,您将获得更新后的 IndexedItem
。
将此操作视为“左折叠”有点不直观,您也可以将其编写为普通折叠,将余积折叠为一个值。
object updateCopy extends Poly1 {
type U = IndexedItem => IndexedItem
implicit val caseItem1: Case.Aux[Item1, U] = at[Item1](i => _.copy(item1 = i))
implicit val caseItem2: Case.Aux[Item2, U] = at[Item2](i => _.copy(item2 = i))
implicit val caseItem3: Case.Aux[Item3, U] = at[Item3](i => _.copy(item3 = i))
}
然后:
def mergeWithExisting(existing: IndexedItem, item: Indexable): IndexedItem =
item.fold(updateCopy).apply(existing)
我个人认为这更具可读性 - 您可以将余积折叠为更新函数,然后将该函数应用于现有的 IndexedItem
。不过,这可能主要是风格问题。
您可以使用单个 Poly2
案例创建一个 Case.Aux[IndexedItem, Indexable, IndexedItem]
,这样您就可以直接使用 apply
,但这会比其中一种折叠方法更冗长且不太惯用(此时您甚至不需要多态函数值 - 您可以只使用普通的 (IndexedItem, Indexable) => IndexedItem
)。
最后,我不确定将折叠方法扩展到 Poly3
等到底是什么意思,但如果您想要提供要转换的额外初始值,那么您可以使累加器类型为元组(或 Tuple3
等)。例如:
object updateCopyWithLog extends Poly2 {
type I = (IndexedItem, List[String])
implicit val caseItem1: Case.Aux[I, Item1, I] = at {
case ((a, log), b) => (a.copy(item1 = b), log :+ "1!")
}
implicit val caseItem2: Case.Aux[I, Item2, I] = at {
case ((a, log), b) => (a.copy(item2 = b), log :+ "2!")
}
implicit val caseItem3: Case.Aux[I, Item3, I] = at {
case ((a, log), b) => (a.copy(item3 = b), log :+ "2!")
}
}
然后:
scala> val example: Indexable = Coproduct(Item1(10))
example: Indexable = Inl(Item1(10))
scala> val existing: IndexedItem = IndexedItem(Item1(0), Item2(), Item3())
existing: IndexedItem = IndexedItem(Item1(0),Item2(),Item3())
scala> example.foldLeft((existing, List.empty[String]))(updateCopyWithLog)
res0: (IndexedItem, List[String]) = (IndexedItem(Item1(10),Item2(),Item3()),List(1!))
如果这不是您所说的 Poly3
部分的意思,我很乐意扩展答案。
作为脚注, LeftFolder
source 建议 case 的输出类型可以与累加器类型不同,因为 tlLeftFolder
具有 OutH
类型参数。这对我来说似乎有点奇怪,因为据我所知, OutH
必然始终是 In
(如果您删除 OutH
并仅使用 In
,则 Shapeless 测试会通过)。我会仔细看看,也许会提出一个问题。
关于scala - 与 Poly 的联产品,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39927666/
我正在尝试在客户端/前端上对图像进行多边形剪辑。一旦我获得积分,是否有办法吸引客户(即无需往返客户)? 据我所知,canvas 只能剪切矩形。也许有一种我不知道的方法?有没有我可以使用的轻量级 Can
我正在尝试使用 shapeless 创建一个可以采用余积的 poly2 函数: case class IndexedItem( item1: Item1, item2: Item2, it
是否可以使用 Poly/ML 构建共享库? 我希望能够创建一个 C Poly/ML 库的 API,并从不同的编程语言(例如 Python)调用/加载它。有人尝试这样做吗? 我知道这可以在 OCaml
我通过 js 模拟了标签区域悬停,并为每个区域创建了 js 函数。因此,正如您所看到的,矩形区域( bool 什维克主义)被绘制成 incide,而保利区域(乌托邦社会主义)只有一个轮廓。 var h
R 中的函数 poly() 用于生成正交向量,有助于解释系数的重要性。但是,我不认为将其用于预测的意义。在我看来,以下两个模型(model_1 和 model_2)应该产生相同的预测。 q=1:11
我已经通读了手册页?poly(我承认我没有完全理解),并且还阅读了书Introduction to Statistical Learning中该函数的描述。 。 我目前的理解是,调用poly(hors
到目前为止,我一直在使用 Poly/ML 进行几个所有源代码文件都在同一目录中的小项目。要构建这些项目,我所要做的就是在 REPL 中运行以下命令: > PolyML.make "Main"; 但现在
在 Poly/ML 中,可以通过以下方式获取全局值的名称: map #1 ((#allVal PolyML.globalNameSpace) ()); 可以使用#allStruct 类似地获得顶级结构
我正在尝试编译一串源代码并使用 Poly/ML 打印解析树。以下代码可以编译,但解析树为空: fun main () = let val stream = TextIO.ope
到目前为止,我一直在使用 Poly/ML 进行几个所有源代码文件都在同一目录中的小项目。要构建这些项目,我所要做的就是在 REPL 中运行以下命令: > PolyML.make "Main"; 但现在
这个问题已经有答案了: Fitting polynomial model to data in R (5 个回答) 已关闭10 年前。 我正在尝试使用 lm(poly) 获得某些点的多项式回归,但对它
我想将多项式系数附加到 data.frame,如下所示: df1 % dplyr::mutate( Linear = poly(x = Y, degree = 3, raw = TR
如何在 Cocos2D 框架中绘制填充多边形? 下面的代码绘制多边形但没有抗锯齿。我应该更改什么? void ccFillPoly( CGPoint *poli, int points, BOOL c
我在 svg 上绘制了人体部位图并将其集成到我的 html 中: .st0{stroke:#010101;stroke-width:0.4;stroke-miterlimit:10;}
我正在尝试了解如何使用 scikit-learn(或其他模块)在 R 中复制 poly() 函数。 例如,假设我在 R 中有一个向量: a <- c(1:10) 我想生成三次多项式: polynomi
我有一个关于公式和用户定义函数的问题: 情况1: clotting 这是coef=的地方添加属性。但还要注意,它会检查调用是否来自“poly”函数本身。由于您的函数名为“xpoly”但返回一个“
如果我有一个像这样的空间线对象: require(sp) x <- c(18.25721, 18.25763,18.25808,18.25846,18.25864,18.25886,18.25892,
我注意到大多数 3d 游戏/渲染环境将实体表示为(通常是三角形)3d 多边形的网格。但是一些示例,例如 Second Life , 或 PovRay使用由一组 3d 图元(立方体、球体、圆锥体、环面等
我正在使用 GeoDjango 查找多边形内的所有点,但它似乎使用边界(NMW、NME、SME、SMW)来查找点。因此,它会返回原始形状之外的结果。 polygon = Polygon((18.382
来自Tiltbrush section的多边形动画无法在 Linux 中为我渲染(在 Chrome 或 Firefox 下):https://poly.google.com/tiltbrush (但是
我是一名优秀的程序员,十分优秀!