第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

什么是Scala中的lambda類型,它們有什么好處?

什么是Scala中的lambda類型,它們有什么好處?

什么是Scala中的lambda類型,它們有什么好處?有時(shí)我偶然發(fā)現(xiàn)了半神秘的符號(hào)def f[T](..) = new T[({type l[A]=SomeType[A,..]})#l] {..}在Scala博客文章中,它給了它一個(gè)“我們使用那種類型 - lambda技巧”的手動(dòng)波。雖然我對(duì)此有一些說明(我們獲得了一個(gè)匿名類型參數(shù)A而不必用它來污染定義?),我發(fā)現(xiàn)沒有明確的來源描述類型lambda技巧是什么,以及它有什么好處。它只是語法糖,還是開了一些新的維度?
查看完整描述

3 回答

?
拉風(fēng)的咖菲貓

TA貢獻(xiàn)1995條經(jīng)驗(yàn) 獲得超2個(gè)贊

當(dāng)你使用更高級(jí)的類型時(shí),類型lambda是非常重要的。

考慮一個(gè)簡(jiǎn)單的例子,為Either [A,B]的正確投影定義一個(gè)monad。monad類型類看起來像這樣:

trait Monad[M[_]] {
  def point[A](a: A): M[A]
  def bind[A, B](m: M[A])(f: A => M[B]): M[B]}

現(xiàn)在,要么是兩個(gè)參數(shù)的類型構(gòu)造函數(shù),但要實(shí)現(xiàn)Monad,您需要為它提供一個(gè)參數(shù)的類型構(gòu)造函數(shù)。對(duì)此的解決方案是使用類型lambda:

class EitherMonad[A] extends Monad[({type λ[α] = Either[A, α]})#λ] {
  def point[B](b: B): Either[A, B]
  def bind[B, C](m: Either[A, B])(f: B => Either[A, C]): Either[A, C]}

這是在類型系統(tǒng)中進(jìn)行currying的一個(gè)示例 - 您已經(jīng)知道了Either的類型,這樣當(dāng)您想要?jiǎng)?chuàng)建EitherMonad的實(shí)例時(shí),您必須指定其中一種類型; 另一方面當(dāng)然是在你調(diào)用point或bind時(shí)提供的。

類型lambda技巧利用了類型位置中的空塊創(chuàng)建匿名結(jié)構(gòu)類型的事實(shí)。然后我們使用#語法來獲取一個(gè)類型成員。

在某些情況下,您可能需要更復(fù)雜的類型lambda,這是寫內(nèi)聯(lián)的痛苦。這是我今天的代碼中的一個(gè)例子:

// types X and E are defined in an enclosing scopeprivate[iteratee] class FG[F[_[_], _], G[_]] {
  type FGA[A] = F[G, A]
  type IterateeM[A] = IterateeT[X, E, FGA, A] }

這個(gè)類專門存在,所以我可以使用像FG [F,G] #IterateeM這樣的名稱來引用IterateeT monad的類型,專門用于第二個(gè)monad的某些變換器版本,專門用于某些第三個(gè)monad。當(dāng)你開始堆疊時(shí),這些類型的構(gòu)造變得非常必要。當(dāng)然,我從未實(shí)例化過FG; 它只是作為一個(gè)黑客讓我在類型系統(tǒng)中表達(dá)我想要的東西。


查看完整回答
反對(duì) 回復(fù) 2019-08-06
?
PIPIONE

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個(gè)贊

其好處與匿名函數(shù)賦予的好處完全相同。

def inc(a: Int) = a + 1; List(1, 2, 3).map(inc)List(1, 2, 3).map(a => a + 1)

使用Scalaz 7的一個(gè)示例用法。我們想要使用一個(gè)Functor可以在一個(gè)函數(shù)中映射第二個(gè)元素的函數(shù)Tuple2。

type IntTuple[+A]=(Int, A)Functor[IntTuple].map((1, 2))(a => a + 1)) // (1, 3)Functor[({type l[a] = (Int, a)})#l].map((1, 2))(a => a + 1)) // (1, 3)

Scalaz提供了一些可以推斷類型參數(shù)的隱式轉(zhuǎn)換Functor,因此我們經(jīng)常避免完全編寫這些轉(zhuǎn)換。上一行可以重寫為:

(1, 2).map(a => a + 1) // (1, 3)

如果使用IntelliJ,則可以啟用“設(shè)置”,“代碼樣式”,“Scala”,“折疊”,“鍵入Lambdas”。然后,這隱藏了語法的苛刻部分,并呈現(xiàn)更可口:

Functor[[a]=(Int, a)].map((1, 2))(a => a + 1)) // (1, 3)

Scala的未來版本可能直接支持這種語法。


查看完整回答
反對(duì) 回復(fù) 2019-08-06
  • 3 回答
  • 0 關(guān)注
  • 874 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)