Relation between Function1 and Reader Monad



虽然我了解阅读器monad的实现,但我在下面给出了两种最突出的方法:

case class Reader[R, A](run: R => A)
def readerMonad[R] = new Monad[({type f[x] = Reader[R,x]})#f] {
def unit[A](a: => A): Reader[R, A] = Reader(_ => a)
override def flatMap[A,B](st: Reader[R, A])(f: A => Reader[R, B]): Reader[R, B] =
Reader(r => f(st.run(r)).run(r))
}

或者更简单地说:

case class Reader[R, A](run: R => A) {
def map[B](f: A => B): Reader[R, B] =
Reader(r => f(run(r)))
def flatMap[B](f: A => Reader[R, B]): Reader[R, B] =
Reader(r => f(run(r)).run(r))
}

我想知道读者莫纳德和功能1之间是否存在内在的关系。我已经准备好了这里和那里的评论暗示这一点。根据定义,Reader是Function1 monad吗?

我不这么认为。但我想好好想想这个概念。

当函数类型为1时,对函数进行排序意味着什么?

也就是说,你取一个函数,然后应用一个返回相同类型函数的函数。我确实认为阅读器是一种特定的技术,独立于函数是函数1的事实。威胁环境只是一种选择,如果我们愿意的话,可以用FunctionN来完成

只是一种直觉。

编辑

以下是Scala中FP编程的练习:

Hard: To cement your understanding of monads, 
give a monad instance for the following type, 
and explain what it means. 
What are its primitive operations? 
What is the action of flatMap? ......
case class Reader[R, A](run: R => A)
object Reader {
def readerMonad[R] = new Monad[({type f[x] = Reader[R,x]})#f] {
def unit[A](a: => A): Reader[R,A]
def flatMap[A,B](st: Reader[R,A])(f: A => Reader[R,B]): Reader[R,B]
}
}”

部分答案让我对不满意

// The action of Reader's `flatMap` is to pass the `r` argument along to both the
// outer Reader and also to the result of `f`, the inner Reader. Similar to how
// `State` passes along a state, except that in `Reader` the "state" is read-only.

我理解这一点,因为我能读懂代码。我认为这种解释不足以清楚地回答这项工作的问题。我在寻找一些比简单描述代码功能更通用的东西。

例如,这意味着什么类型的R是固定的。这对链式计算来说意味着什么?作为效果返回的函数采用相同的输入参数类型?

Reader[R, A]R => A的包装器(因此方法可以仅在类内部定义,而不是作为函数的扩展方法(。函数f可以被封装到读取器Reader(f),读取器r可以被展开到函数r.run。所以Reader[R, A]↔CCD_ 8是一个同构。

Reader[R, ?]具有类型为Monad的实例。

CCD_ 11具有类型为CCD_ 12的实例。

最新更新