- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用很多柯里化(Currying)函数,采用类似的论点,但不完全是。出于这个原因,我会发现有一种方法来执行第 n 个参数的转置、应用和组合以及“最终”结果是非常有益的。例子:
val f :X=>Y=>W=>Z
def compose1[A](w :A=>Y) :X=>A=>W=>Z
def transpose1 :X=>W=>Y=>Z
def apply1(y :Y) :X=>W=>Z
implicit class Apply2[X, Y, Z](private val f :X=>Y=>Z) extends AnyVal {
def transpose :Y=>X=>Z = { y :Y => x :X => f(x)(y) }
def provide(y :Y) :X=>Z ={ x :X => f(x)(y) }
def compose[A](y :A=>Y) : X=>A=>Z = { x :X => a :A => f(x)(y(a)) }
def apply[A, B]()(implicit ev :Z <:< (A=>B)) :Apply3[X, Y, A, B] = new Apply3[X, Y, A, B]((x :X) => (y :Y) => ev(f(x)(y)))
}
val f :A=>B=>C=>D=>E=>F
val c = f()().compose( (x :X) => new C(x)) :A=>B=>X=>D=>E=>F
val t = f()().transpose :A=>B=>D=>C=>E=>F
val s = f()().set(new C()) :A=>B=>D=>E=>F
Apply
它提供了一个递归
apply()
返回嵌套
Apply
的方法实例。
最佳答案
好吧,我的心仍然很痒,但我终于明白了!不过,我在一段时间内完成的最困难的编程任务。如果有人有改进建议(包括命名、符号和一般语法),我会全力以赴。
/** Represents a partially applied, curried function `F` which is of the form `... X => A`,
* where X is the type of the first argument after (partial) application.
* Provides methods for manipulating functions `F` around this argument.
* @tparam F type of the manipulated function in a curried form (non-empty sequence of single argument lists)
* @tparam C[G] result of mapping partial result `(X=>A)` of function `F` to `G`.
* @tparam X type of the argument represented by this instance
* @tparam A result type of function F partially applied up to and including argument X
*/
abstract class Curry[F, C[G], X, A](private[funny] val f :F) { prev =>
/** Result of partial application of this function F up to and including parameter `X`. */
type Applied = A
/** Replace X=>A with G as the result type of F. */
type Composed[G] = C[G]
/** A function which takes argument `W` instead of `X` at this position. */
type Mapped[W] = Composed[W=>A]
/** Provide a fixed value for this argument, removing it from the argument list.
* For example, the result of `Curry{a :Any => b :Byte => c :Char => s"$a$b$c" }().set(1.toByte)`
* (after inlining) would be a function `{a :Any => c :Char => s"$a${1.toByte}$c" }`.
*/
def set(x :X) :Composed[A] = applied[A](_(x))
/** Change the type of this argument by mapping intended argument type `W` to `X` before applying `f`.
* For example, given a function `f :F <:< D=>O=>X=>A` and `x :W=>X`, the result is `{d :D => o :O => w :W => f(d)(o)(x(w)) }`.
*/
def map[W](x :W=>X) :Composed[W=>A] = applied[W=>A]{ r :(X=>A) => (w :W) => r(x(w)) }
/** Map the result of partial application of this function up to argument `X` (not including).
* For example, if `F =:= K=>L=>X=>A`, the result is a function `{k :K => l :L => map(f(k)(l)) }`.
* @param map function taking the result of applying F up until argument `X`.
* @return resul
*/
def applied[G](map :((X => A) => G)) :Composed[G]
/** If the result of this partial application is a function `A <:< Y=>Z`, swap the order of arguments
* in function `F` from `=>X=>Y=>` to `=>Y=>X=>`.
*/
def transpose[Y, Z](implicit ev :A<:<(Y=>Z)) :Composed[Y=>X=>Z] = applied[Y=>X=>Z] {
r :(X=>A) => y :Y => x :X => ev(r(x))(y)
}
/** Skip to the next argument, i.e return an instance operating on the result of applying this function to argument `X`. */
def apply[Y, Z]()(implicit ev :this.type<:<Curry[F, C, X, Y=>Z]) = new NextArg[F, C, X, Y, Z](ev(this))
/** Skip to the next argument, i.e return an instance operating on the result of applying this function to argument `X`.
* Same as `apply()`, but forces an implicit conversion from function types which `apply` wouldn't.
*/
def __[Y, Z](implicit ev :this.type<:<Curry[F, C, X, Y=>Z]) = new NextArg[F, C, X, Y, Z](ev(this))
}
/** Operations on curried functions. */
object Curry {
type Self[G] = G
type Compose[C[G], X] = { type L[G] = C[X=>G] }
/** Extension methods for modifying curried functions at their first argument (and a source for advancing to subsequent arguments. */
@inline def apply[A, B](f :A=>B) :Arg0[A, B] = new Arg0(f)
/** Implicit conversion providing extension methods on curried function types. Same as `apply`, but doesn't pollute namespace as much. */
@inline implicit def ImplicitCurry[A, B](f :A=>B) :Arg0[A, B] = new Arg0(f)
/** Operations on the first argument of this function. */
class Arg0[X, Y](x :X=>Y) extends Curry[X=>Y, Self, X, Y](x) {
def applied[G](map: (X=>Y) => G) :G = map(f)
}
class NextArg[F, C[G], X, Y, A](val prev :Curry[F, C, X, Y=>A]) extends Curry[F, (C Compose X)#L, Y, A](prev.f) {
override def applied[G](map: (Y => A) => G): prev.Composed[X => G] =
prev.applied[X=>G] { g :(X=>Y=>A) => x :X => map(g(x)) }
}
}
def f :Byte=>Short=>Int=>Long=>String = ???
import Curry.ImplicitCurry
f.set(1.toByte) :(Short=>Int=>Long=>String)
f.map((_:String).toByte) :(String=>Short=>Int=>Long=>String)
f.__.set(1.toShort) :(Byte=>Int=>Long=>String)
Curry(f)().map((_:String).toShort) : (Byte=>String=>Int=>Long=>String)
关于scala - scala中柯里化(Currying)函数的第n个参数的操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35370433/
我正在努力做到这一点 在我的操作中从数据库获取对象列表(确定) 在 JSP 上打印(确定) 此列表作为 JSP 中的可编辑表出现。我想修改然后将其提交回同一操作以将其保存在我的数据库中(失败。当我使用
我有以下形式的 Linq to Entities 查询: var x = from a in SomeData where ... some conditions ... select
我有以下查询。 var query = Repository.Query() .Where(p => !p.IsDeleted && p.Article.ArticleSections.Cou
我正在编写一个应用程序包,其中包含一个主类,其中主方法与GUI类分开,GUI类包含一个带有jtabbedpane的jframe,它有两个选项卡,第一个选项卡包含一个jtable,称为jtable1,第
以下代码产生错误 The nested query is not supported. Operation1='Case' Operation2='Collect' 问题是我做错了什么?我该如何解决?
我已经为 HA redis 集群(2 个副本、1 个主节点、3 个哨兵)设置了本地 docker 环境。只有哨兵暴露端口(10021、10022、10023)。 我使用的是 stackexchange
我正在 Desk.com 中构建一个“集成 URL”,它使用 Shopify Liquid 模板过滤器语法。对于开始日期为 7 天前而结束日期为现在的查询,此 URL 需要包含“开始日期”和“结束日期
你一定想过。然而情况却不理想,python中只能使用类似于 i++/i--等操作。 python中的自增操作 下面代码几乎是所有程序员在python中进行自增(减)操作的常用
我需要在每个使用 github 操作的手动构建中显示分支。例如:https://gyazo.com/2131bf83b0df1e2157480e5be842d4fb 我应该显示分支而不是一个。 最佳答
我有一个关于 Perl qr 运算符的问题: #!/usr/bin/perl -w &mysplit("a:b:c", /:/); sub mysplit { my($str, $patt
我已经使用 ArgoUML 创建了一个 ERD(实体关系图),我希望在一个类中创建两个操作,它们都具有 void 返回类型。但是,我只能创建一个返回 void 类型的操作。 例如: 我能够将 book
Github 操作仍处于测试阶段并且很新,但我希望有人可以提供帮助。我认为可以在主分支和拉取请求上运行 github 操作,如下所示: on: pull_request push: b
我正在尝试创建一个 Twilio 工作流来调用电话并记录用户所说的内容。为此,我正在使用 Record,但我不确定要在 action 参数中放置什么。 尽管我知道 Twilio 会发送有关调用该 UR
我不确定这是否可行,但值得一试。我正在使用模板缓冲区来减少使用此算法的延迟渲染器中光体积的过度绘制(当相机位于体积之外时): 使用廉价的着色器,将深度测试设置为 LEQUAL 绘制背面,将它们标记在模
有没有聪明的方法来复制 和 重命名 文件通过 GitHub 操作? 我想将一些自述文件复制到 /docs文件夹(:= 同一个 repo,不是远程的!),它们将根据它们的 frontmatter 重命名
我有一个 .csv 文件,其中第一列包含用户名。它们采用 FirstName LastName 的形式。我想获取 FirstName 并将 LastName 的第一个字符添加到它上面,然后删除空格。然
Sitecore 根据 Sitecore 树中定义的项目名称生成 URL, http://samplewebsite/Pages/Sample Page 但我们的客户有兴趣降低所有 URL(页面/示例
我正在尝试进行一些计算,但是一旦我输入金额,它就会完成。我只是希望通过单击按钮而不是自动发生这种情况。 到目前为止我做了什么: Angular JS - programming-fr
我的公司创建了一种在环境之间移动文件的复杂方法,现在我们希望将某些构建的 JS 文件(已转换和缩小)从一个 github 存储库移动到另一个。使用 github 操作可以实现这一点吗? 最佳答案 最简
在我的代码中,我创建了一个 JSONArray 对象。并向 JSONArray 对象添加了两个 JSONObject。我使用的是 json-simple-1.1.jar。我的代码是 package j
我是一名优秀的程序员,十分优秀!