type lambda
生活随笔
收集整理的這篇文章主要介紹了
type lambda
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
其實type lambda就是類型系統上的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有兩個類型參數,但是Monad只能接受M[_]包裹類一個參數,
所以需要將Either轉換成符合規則的1個類型參數。做法就是在定義的時候實現填入一個,而另一個留到point和bind調用的時候再進行填入。可以看到紅色字體部分Either的A已經被確定,然后剩下的α被變形成了λ[α],是符合M[_]定義的。λ就是一個柯里化出來的類型,A雖然已經看不見了,但是被隱藏其中。
另外一個例子:
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) // 必須要這樣定義類型參數
轉載于:https://www.cnblogs.com/pyes/p/4938416.html
總結
以上是生活随笔為你收集整理的type lambda的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 安卓性能调优工具简介(转)
- 下一篇: AutoMySQLBackup 3.0