- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
例如,我定义了一个 Monad Trait
,如下所示:
trait Monad[F[_]] {
def unit[T](a: => T): F[T]
def flatMap[A, B](fa: F[A])(f: A => F[B]): F[B]
}
我创建了一个实现上述接口(interface)的 ListMonad
:
class ListMonad extends Monad[List] {
override def unit[T](a: => T): List[T] = List(a)
override def flatMap[A, B](fa: List[A])(f: (A) => List[B]): List[B] = fa flatMap f
}
现在我想以“通用方式”验证上面的 Monad。 monad 的第一个属性是Left Identity
。这意味着:如果我们给一个单子(monad)“m”,一个值“x”和一个函数“f”。它应该满足:m.(identity(x)).flatMap(f) == f(x)
例如,我创建了以下验证器类来检查该假设:
case class MonadVerifier[A, F[_]](monad: Monad[F[_]])(f: A => F[A]) {
def leftIdentity(value: A): Boolean =
monad.flatMap[A, A](monad.unit(value))(f) == f(value)
}
在这段代码中,我遇到了错误:
Type mismatch. expected: (A) => F[_][A], actual: (A) => F[A]
我不知道在 Scala 中,如何将 F[A]
表示为泛型。我想如果我定义了 F[_]
Scala 会在调用 F[A]
时将泛型类型插入到 [_]
中,但事实并非如此真的。
在这种情况下请帮助我。谢谢
最佳答案
@Dima 说的:
错误是
MonadVerifier[A, F[_]](monad: Monad[F[_]])
应该是
MonadVerifier[A, F[_]](monad: Monad[F])
第一行不是说 F
是一个 monad(F
有种类 * -> *
和 类型的值code>F[_]
),但是 F[_]
(即类型构造函数 F
应用于任何正确类型的类型)是一个monad,(F
具有类型 * -> (* -> *)
和类型 F[_][_]
的值)。
对此进行扩展(如果需要,请忽略此内容):Monad
期望其类型参数采用一个类型参数并返回一个具体类型。 Monad
的参数据说具有种类 * -> *
(从具体类型到具体类型的“函数”),并且 Monad
本身具有kind (* -> *) -> *
(“函数”来自“函数”,从具体类型到具体类型再到具体类型)。当你说 Monad[F[_]]
时,你暗示参数 (F[_]
) 具有种类 * -> *
,因为那是 Monad
期望的那种。 F[_]
是类型构造函数 F
的应用(kind a -> b
对于一些未知类型 a
和 b
) 到任何具体类型(由 _
暗示,强制 F
的种类被限制为 * -> k
对于一些未知的 k
)。由于 F[_]
也必须是 * -> *
因为 Monad
,这限制了 k = (* -> * )
所以 F
被强制为 * -> (* -> *)
类型,这是 (*, * ) -> *
。这意味着 F
有两个类型参数,并且在第二个参数中它是单子(monad)的(如 Either
)。
将来,可能会使用上下文绑定(bind)来避免类似的混淆:
MonadVerifier[A, F[_]: Monad] // no params needed
关于Scala:用一些通用类型制作更高种类的类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44929406/
我正在为我的项目使用 Google Cloud Datastore(而非 NDB)。 python2.7 和 Django。 我想创建一个新模型,比如说 Tag 模型。 class Tag(db.Mo
我正在研究使用 monad 推导式来表示 SQL 查询,并生成适当的 SQL。乍一看,这不是问题,看起来很合适。但我必须限制类型,这些类型只能形成产品的单子(monad),而不是总和,而且我想不出一种
在Foldable文档,我看到以下实例: (Foldable f, Foldable g) => Foldable (Compose * * f g) 如果我查看 Compose 的定义,我看到它被声
给定一个团队->运动员关系并查询所有运动员。什么 我对fetch="Join"有误解吗?该映射是否应引起 通过联接加载团队?在对运动员进行迭代时 仍然懒惰地加载团队。 public class Ath
我才刚刚开始熟悉类型的概念,所以如果我没有很好地表达我的问题,请耐心等待...... 值有类型: 3 :: Int [1,2,3] :: [Int] ('c',True) :: (Char,Bool)
这里是我在 javascript 中的一个数组,效果很好! _rowData: [ { name: "Most Recent", view: "recentView" }, { nam
我正在尝试绘制 pandas Series用一条线。 这些线产生显示的输出和散点图。 import pandas as pd print(pd.__version__) ... print(type(
我正在使用 gcloud npm 模块。提前致谢。 我尝试了很多,但什么也没得到。 最佳答案 您需要对该实体进行查询并计算结果。 var query = ds.createQuery('EntityK
一些上下文 我对 libclang 不是很熟悉。我只是修改一个使用 the python bindings to libclang 的 vim 插件. 有一个 python 函数接收游标参数。当前 C
我有一个链接到 zlib v1.2.3 的程序,它出现以下错误: deflateEnd error 'no msg' kind: 'Z_DATA_ERROR': -3 该程序已成功处理许多要压缩的不同
我正在尝试通过遵循 the docs 来实现 log4rs .我的目标是将 info!("INFO") 的结果放入文件 requests.log,但出现错误: thread 'main' panick
Program type already present: org.apache.http.ContentTooLongException Message{kind=ERROR, text=Progr
当我执行 ng generate component faqs 时,我无法将新组件添加到我的 Nativescript 项目中它返回错误: Option "entryComponent" is dep
我是一名优秀的程序员,十分优秀!