2015-03-05 20 views
7

İsim-adı parametresiyle anonim bir işlev yazmak için uğraşıyorum. İşte ben yorgunum.scala Anonim bir işlevin ad-soyadı parametresi

Bu, aşağıdaki hata nedeniyle başarısız oluyor.

Error:(106, 31) identifier expected but '=>' found. 
    val fun = (x: Boolean, y: =>Int) => if(x) y else 0 
          ^
Error:(109, 3) ')' expected but '}' found. 
    } 
^

Standart bir işlevle aynı kod nasıl çalışır?

def fun1(x: Boolean, y: =>Int) = if(x) y else 0 

Herhangi bir işaretçi?

--------------- Edit -----------------

Bir iki parça sorunu vardı. Senia cevap ilk davayı çözdü. Bir fonksiyonun fonksiyon aldığını varsayalım.

def xxx[A,B](f:(A,=>B)=>B)={} 

Senia çözümü için işe yarıyor.

val fun: (Int, =>Boolean) => Boolean = (x, y) => y 
xxx[Int,Boolean](fun) 

Ancak aradaki eğlenceden kurtulmak ve anonim işlevle xxx'i aramak istiyorum. Yapılmayacaktır. Çalışmaya devam etmeyecektir. Bunun nasıl yapıldığına dağir fikri olan ?

cevap

9

Böyle yerine parametrelerin tiplerinin, isimsiz bir işlev türünü belirtmek olabilir:

val fun: (Boolean, => Int) => Int = (x, y) => if(x) y else 0 

scala> fun(false, {println("!"); 2}) 
res1: Int = 0 

scala> fun(true, {println("!"); 2}) 
! 
res2: Int = 2 

=> Int

doğru tür adı değil, yöntem bildiriminde parametreleri bloğunda by-name parametreleri için özel bir sözdizimi var veya anonim işlev türü.

değişkene anonim işlev atamak istemiyorsanız SLS4.6 Fonksiyon Açıklamasında ve Tanımlar durumda

ParamType ::= Type 
      | ‘=>’ Type 
      | Type ‘*’ 

görün yapabildin böyle kullanılması tür kesmesi ya:

xxx[Int, Boolean]{ (x, y) => y } 

Ya türünü bu şekilde belirtin:

xxx({ (x, y) => y }: ((Int, => Boolean) => Boolean)) 
+0

Merhaba, Çözümünüz çalışıyor. Ancak bir şey daha var. orijinal gönderiyi düzenledi. Bana yardımcı olabilir misiniz. –

+0

@SajithSilva: bkz. Güncelleştirme – senia

+0

Yardımın gerçekten uygun olduğuna emin olun. –

İlgili konular