type lambda
生活随笔
收集整理的這篇文章主要介紹了
type lambda
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
其實(shí)type lambda就是類型系統(tǒng)上的currying。
type lambda長的什么樣子?Sample as below
trait Monad[M[_]] {def point[A](a: A): M[A]def bind[A, B](m: M[A])(f: A => M[B]): M[B]}class EitherMonad[A] extends Monad[({type λ[α] = Either[A, α]})#λ] {override def point[B](b: B): Either[A, B] = ???override def bind[B, C](m: Either[A, B])(f: (B) => Either[A, C]): Either[A, C] = ???}Either有兩個(gè)類型參數(shù),但是Monad只能接受M[_]包裹類一個(gè)參數(shù),
所以需要將Either轉(zhuǎn)換成符合規(guī)則的1個(gè)類型參數(shù)。做法就是在定義的時(shí)候?qū)崿F(xiàn)填入一個(gè),而另一個(gè)留到point和bind調(diào)用的時(shí)候再進(jìn)行填入??梢钥吹郊t色字體部分Either的A已經(jīng)被確定,然后剩下的α被變形成了λ[α],是符合M[_]定義的。λ就是一個(gè)柯里化出來的類型,A雖然已經(jīng)看不見了,但是被隱藏其中。
另外一個(gè)例子:
def foo[M[_]](value: M[Int]) = valuefoo(List(1,2,3)) // res: List(1,2,3)
foo((x: Int) => println) // 這樣子是不行的
foo[({type X[Y] = Function1[Y, Unit]})#X]((value: Int) => println) // 必須要這樣定義類型參數(shù)
轉(zhuǎn)載于:https://www.cnblogs.com/pyes/p/4938416.html
總結(jié)
以上是生活随笔為你收集整理的type lambda的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓性能调优工具简介(转)
- 下一篇: AutoMySQLBackup 3.0