我正在学习函数式编程,并且有一些(可能很明显,但不适合我:))关于monad的问题.每个monad都是一个应用程序.应用仿函数又可以定义为高级类型如下(pure方法省略):
trait ApplicativeFunctor[F[_]]{
def ap[A](fa: F[A])(f: F[A => B]): F[B]
}
Run Code Online (Sandbox Code Playgroud)
据我所知,这个类型类意味着我们可以采用两个值F[A],F[B]一个函数(A, B) => C和构造F[C].
这个属性使我们能够构建列表反转功能:
def reverseApList[F[_]: ApplicativeFunctor, A](lst: List[F[A]]): F[List[A]]
Run Code Online (Sandbox Code Playgroud)
我们拥有
trait SomeType[A]
Run Code Online (Sandbox Code Playgroud)
现在考虑
type MyFree[A] = Free[SomeType, A]
val nt: NaturalTransformation[SomeType, Id]
val lst: List[MyFree[Int]]
Run Code Online (Sandbox Code Playgroud)
问题:为什么lst.map(_.foldMap(nt))和reverseApList(lst).foldMap(nt)相同?是应用仿函数法还是其他原因?你能解释一下吗?
我正在学习有关CPU高速缓存的信息,但是现在我仍然对高速缓存一致性协议(MESI)有误解。想象一下,我们有2个内核在共享状态下有一条缓存行。其中一个执行读取,另一个执行写入:
;mem is cached in Shared state
Thread 1 (core 1) Thread 2 (core 2)
mov rax, [mem] mov [mem], dword 1
Run Code Online (Sandbox Code Playgroud)
核心1可以观察到某些中间状态。我的意思是这样的:
Core 2将缓存行标记L1D为已修改,并将更改写入其中。core 1的L1D高速缓存仍处于Shared状态,所以读恰好读取陈旧的价值。core 1的L1D缓存中的行标记为无效。英特尔的MESI / MESIF实施中是否可能出现这种情况?