见https://www.fpcomplete.com/user/edwardk/phoas
一些背景代码
trait ProfunctorStr[->[_, _]] {
def dimap[A, B, C, D]: (C => A) => (B => D) => (A -> B) => (C -> D) = { f =>
g => {
lazy val h: (A -> B) => (C -> B) = mapfst(f)
lazy val hh: (C -> B) => (C -> D) = mapsnd(g)
h andThen hh
}
}
def mapfst[A, B, C]: (C => A) => (A -> B) => (C -> B) =
f => p => dimap[A, B, C, B](f)(x => x)(p)
def mapsnd[A, B, C]: (B => C) => (A -> B) => (A -> C) =
f => p => dimap[A, B, A, C](x => x)(f)(p)
// convenient for certain implementations
def mfst[A, B, C](p: A -> B)(f: C => A): C -> B = mapfst(f)(p)
def msnd[A, B, C](p: A -> B)(f: B => C): (A -> C) = mapsnd(f)(p)
}
abstract class Rec[F[_, _], A, B] {
def runRec[R]: (B => R) => (F[A, R] => R) => R
}
object Rec {
abstract class RecProfunctor[F[_, _]](implicit F: ProfunctorStr[F])
extends ProfunctorStr[({type l[x, y] = Rec[F, x, y] })#l] {
def dimap[A, B, C, D] = { f =>
g => rab =>
def P = function1Profunctor
new Rec[F, C, D] {
def runRec[R] = { ??? }
}
}
}
}
阅读那篇文章我觉得我明白了要点,但是我在 scala 中实现时遇到了麻烦,特别是如何转换 Rec[F, C, D] { runRec[R] = { ?!?!?! 我真的很想得到这个所以如果你能解释如何转换它
(B => R) => (F[A, R] => R) => R
进入
(D => R) => (F[C, R] => R) => R
我认为......任何方式的任何和所有帮助都非常感谢,并且非常喜欢细节。谢谢你