- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
关注 Nick Partidge's presentation关于推导 scalaz ,我必须看看这个例子,这真是太棒了:
import scalaz._
import Scalaz._
def even(x: Int) : Validation[NonEmptyList[String], Int]
= if (x % 2 ==0) x.success else "not even: %d".format(x).wrapNel.fail
println( even(3) <|*|> even(5) ) //prints: Failure(NonEmptyList(not even: 3, not even: 5))
<|*|>
方法是这样做的,这里是源代码:
def <|*|>[B](b: M[B])(implicit t: Functor[M], a: Apply[M]): M[(A, B)]
= <**>(b, (_: A, _: B))
<**>
方法,其声明如下:
def <**>[B, C](b: M[B], z: (A, B) => C)(implicit t: Functor[M], a: Apply[M]): M[C]
= a(t.fmap(value, z.curried), b)
M[B]
)的高级类型,但可以通过 Validation
(它有两种类型的参数)? (_: A, _: B)
定义函数 (A, B) => Pair[A,B]
第二种方法期望的是:失败情况下 Tuple2/Pair 发生了什么?看不到元组! 最佳答案
类型构造函数作为类型参数M
是 Scalaz 的主要皮条客之一的类型参数,MA , 表示拉皮条值的类型构造函数(又名高级类型)。此类型构造函数用于查找 Functor
的适当实例。和 Apply
,这是方法的隐含要求 <**>
.
trait MA[M[_], A] {
val value: M[A]
def <**>[B, C](b: M[B], z: (A, B) => C)(implicit t: Functor[M], a: Apply[M]): M[C] = ...
}
We distinguish between first-order types and type constructors, which take type parameters and yield types. A subset of first-order types called value types represents sets of (first-class) values. Value types are either concrete or abstract. Every concrete value type can be represented as a class type, i.e. a type designator (§3.2.3) that refers to a class1 (§5.3), or as a compound type (§3.2.7) representing an intersection of types, possibly with a refinement (§3.2.7) that further constrains the types of itsmembers. Abstract value types are introduced by type parameters (§4.4) and abstract type bindings (§4.3). Parentheses in types are used for grouping. We assume that objects and packages also implicitly define a class (of the same name as the object or package, but inaccessible to user programs).
Non-value types capture properties of identifiers that are not values (§3.3). For example, a type constructor (§3.3.3) does not directly specify the type of values. However, when a type constructor is applied to the correct type arguments, it yields a first-order type, which may be a value type. Non-value types are expressed indirectly in Scala. E.g., a method type is described by writing down a method signature, which in itself is not a real type, although it gives rise to a corresponding function type (§3.3.1). Type constructors are another example, as one can write type Swap[m[_, _], a,b] = m[b, a], but there is no syntax to write the corresponding anonymous type function directly.
List
是一个类型构造函数。您可以申请类型
Int
获取值类型,
List[Int]
,它可以对一个值进行分类。其他类型构造函数接受多个参数。
scalaz.MA
要求它的第一个类型参数必须是一个类型构造函数,它接受一个类型来返回一个值类型,语法为
trait MA[M[_], A] {}
.类型参数定义描述了类型构造函数的形状,称为它的 Kind。
List
据说有那种'
* -> *
.
MA
包装
Validation[X, Y]
类型的值?型号
Validation
有种
(* *) -> *
, 并且只能作为类型参数传递给声明为
M[_, _]
的类型参数.
Validation[X, Y]
类型的值到
MA
:
object Scalaz {
implicit def ValidationMA[A, E](v: Validation[E, A]): MA[PartialApply1Of2[Validation, E]#Apply, A] = ma[PartialApply1Of2[Validation, E]#Apply, A](v)
}
Validation
,修复错误的类型,但不应用成功的类型。
PartialApply1Of2[Validation, E]#Apply
最好写成
[X] => Validation[E, X]
.我最近提议在 Scala 中添加这样的语法,它可能会在 2.9 中发生。
def validation[A, B](a: A, b: B) = ...
def partialApply1Of2[A, B C](f: (A, B) => C, a: A): (B => C) = (b: B) => f(a, b)
Validation[String, Int]
与
Validation[String, Boolean]
,因为两者共享类型构造函数
[A] Validation[String, A]
.
<**>
需要类型构造函数
M
必须有
Apply 的关联实例和
Functor .这构成了一个 Applicative Functor,它和 Monad 一样,是一种通过某种效果来构建计算的方法。在这种情况下,结果是子计算可能会失败(并且当它们失败时,我们会累积失败)。
Validation[NonEmptyList[String], A]
可以包装类型为
A
的纯值在这个“效果”中。
<**>
运算符采用两个有效值和一个纯函数,并将它们与该容器的 Applicative Functor 实例组合在一起。
Option
的工作原理应用仿函数。这里的“效果”是失败的可能性。
val os: Option[String] = Some("a")
val oi: Option[Int] = Some(2)
val result1 = (os <**> oi) { (s: String, i: Int) => s * i }
assert(result1 == Some("aa"))
val result2 = (os <**> (None: Option[Int])) { (s: String, i: Int) => s * i }
assert(result2 == None)
(String, Int) => String
的纯函数。 ,适用于有效的论据。请注意,结果与参数包装在相同的效果(或容器,如果您愿意)中。
ZipStream
.
Option
和
[A]Validation[X, A]
都是 Monad,所以你也可以使用
Bind
(又名 flatMap):
val result3 = oi flatMap { i => os map { s => s * i } }
val result4 = for {i <- oi; s <- os} yield s * i
<|**|>
真的很像
<**>
,但它为您提供了纯函数,可以根据结果简单地构建一个 Tuple2。
(_: A, _ B)
是
(a: A, b: B) => Tuple2(a, b)
的简写
(fa ⊛ fb ⊛ fc ⊛ fd) {(a, b, c, d) => .... }
what is happening to the Tuple2/Pair in the failure case?
<**>
的两个参数)都成功时才会运行它。如果是这样,它将这些组合成一个
Success
.这个逻辑在哪里?这定义了
Apply
[A] Validation[X, A]
的实例.我们要求类型 X 必须有
Semigroup
可用,这是组合单个错误的策略,每个错误类型为
X
, 转化为相同类型的聚合错误。如果您选择
String
作为您的错误类型,
Semigroup[String]
连接字符串;如果您选择
NonEmptyList[String]
,来自每个步骤的错误被连接成一个更长的
NonEmptyList
的错误。当两个
Failures
发生在下面时,这种连接发生合并,使用
⊹
运算符(它用隐式扩展为,例如,
Scalaz.IdentityTo(e1).⊹(e2)(Semigroup.NonEmptyListSemigroup(Semigroup.StringSemigroup))
。
implicit def ValidationApply[X: Semigroup]: Apply[PartialApply1Of2[Validation, X]#Apply] = new Apply[PartialApply1Of2[Validation, X]#Apply] {
def apply[A, B](f: Validation[X, A => B], a: Validation[X, A]) = (f, a) match {
case (Success(f), Success(a)) => success(f(a))
case (Success(_), Failure(e)) => failure(e)
case (Failure(e), Success(_)) => failure(e)
case (Failure(e1), Failure(e2)) => failure(e1 ⊹ e2)
}
}
Option
的子计算或
[A] Validation[E, A]
可以与
Apply
结合使用或与
Bind
.你什么时候会选择一个?
Apply
,计算的结构是固定的。将执行所有子计算;一个人的结果不能影响其他人。只有“纯”函数对发生的事情有一个概述。另一方面,一元计算允许第一个子计算影响后面的子计算。
Success
值以提供给后续验证。但是,我们很高兴子验证是独立的,因此我们可以通过 Applicative 将它们组合起来,并收集我们遇到的所有失败。 Applicative Functors 的弱点变成了强项!
关于scala - scalaz 中的函数语法谜题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2545248/
这个问题在这里已经有了答案: With arrays, why is it the case that a[5] == 5[a]? (20 个答案) 关闭 7 年前。 我正在尝试解开这个谜团: in
很难为这个问题找到合适的标题。欢迎编辑! :) 这是我的来源xml代码: [color hex] [color hex] [color he
编辑:看起来像一个索引问题,在问题底部更新 我有以下查询 + 子查询,其结果我无法解释。我从这个最小的输入数据集开始(这里的应用程序正在捕获数据变化,PK 是 id + tx_id)。 mysql>
基本上,我在这里试图实现的是让全局变量具有指向结构的指针数组,其大小在编译时是未知的——在我下面的示例中,它是 my_struct **tab。在最终版本中,我想调用一个 JNI 方法来初始化我的指针
所以我想弄清楚这个谜题: function fun1(){ var result = []; for (var i = 0; i < 5; i++){ result.p
一群 child 围成一圈。选择第一个 child ,他们从那个 child 开始顺时针计数,直到达到固定数字(n,在游戏开始时给出)。当计数达到 n 时,第 n 个位置的 child 被淘汰。游戏从
(我是 JS 新手,所以请耐心等待)我正在使用 table 来构建滑动益智游戏。我需要一个可以扰乱值的函数,但我不确定应该如何让它显示在表格单元格中。现在我的代码只是按顺序显示数字。 我有两个函数 -
我有一个 UserForm,xForm,它在类模块(假设为 TestClass)中实例化为: 'TestClass Dim Form as New xForm Private WithEvents E
如果没有循环或游标,如何获取日期间隔列表并将它们转换为 1 和 0 的字符串,这样: 每一位代表从 min(所有日期)到 max(所有日期)的每一天 如果该天属于任何日期间隔,则该位为 1 如果该天不
我读过很多A*算法的伪代码,但它们都没有真正解释如何输出解。我相信我理解使用优先级队列表示尚未访问的内容和使用已探索的表的概念,但是当我执行该算法时,我不知道在什么时候打印出结果。有没有人有一个伪代码
以下两个查询不会返回相同的结果。为什么? 注意 :我发现这个问题是一个 Mysql 难题,我没有关于这个问题的更多数据? SELECT table1.* FROM table1 LEFT JOIN t
如果您对我应该如何在 python 中执行以下任务有任何建议,我正在徘徊:假设我有以下类(class): class A(object): self._classes = [] def
我很难理解如何在不引起内存分配问题的情况下解决这个问题。我很确定我的逻辑是合理的,但不幸的是,这似乎还不够好。有没有人对此有任何建议,以便我了解如何更有效地编写代码? 问题来了:示例输入:1个5 2
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎与 help center 中定义的范围内的编程无关。 . 关闭 8 年前。 Improve
所以这是一个难题: “kb”是扩展 java.util.Hashtable 的类的实例键是一个字符串,存储的值是一个名为“IntelCard”的类 此代码提取 key ,并尝试从表中打印数据
我有以下难题要解决,但我不确定我该怎么做。它说: 有一个 Ubuntu Linux C 程序可以输出变量的地址。 v1: 0xa156128 v2: 0xff97410c v3: 0xf750e34b
我有一个简单的 HTML 页面如下:- Col1 Col2
大家好, 我尝试了八个难题的解决方案发布 here由 joel Neely 玩弄并修改它,以便可以用来解决更高的网格[将网格的字符串表示更改为二维整数表示并修改相应的逻辑]。然而,修改后的代码可以解决
我正在尝试解决下文详述的 projecteuler 难题。我当前的函数适用于数字 1 到 10,但是当我尝试 1 到 20 时,它会一直循环下去而没有结果。 2520 is the smallest
我在为基于图 block 的游戏编写随机关卡生成器时遇到了一个有趣的问题。我已经为它实现了一个强力求解器,但它的速度呈指数级下降,而且绝对不适合我的用例。我不一定要寻找完美的解决方案,我会对性能良好的
我是一名优秀的程序员,十分优秀!