小编Lin*_*sco的帖子

解释免费monad列表与解释列表的免费monad

我正在学习函数式编程,并且有一些(可能很明显,但不适合我:))关于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)相同?是应用仿函数法还是其他原因?你能解释一下吗?

monads scala scalaz

8
推荐指数
1
解决办法
132
查看次数

缓存操作是原子的吗?

我正在学习有关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可以观察到某些中间状态。我的意思是这样的:

  1. Core 2将缓存行标记L1D为已修改,并将更改写入其中。
  2. 高速缓存行core 1L1D高速缓存仍处于Shared状态,所以读恰好读取陈旧的价值。
  3. 读取过时的值之后,已经将core 1L1D缓存中的行标记为无效。

英特尔的MESI / MESIF实施中是否可能出现这种情况?

assembly intel cpu-architecture cpu-cache mesi

4
推荐指数
1
解决办法
312
查看次数

标签 统计

assembly ×1

cpu-architecture ×1

cpu-cache ×1

intel ×1

mesi ×1

monads ×1

scala ×1

scalaz ×1