Scala neden işlevlerin açık dönüş türüne sahip olmasını gerektiriyor?


11

Son zamanlarda Scala'da programlamayı öğrenmeye başladım ve şimdiye kadar eğlenceliydi. Gerçekten sezgisel bir şey gibi görünen başka bir işlev içindeki işlevleri bildirme yeteneğini seviyorum.

Scala hakkında sahip olduğum bir evcil hayvan huşu, Scala'nın işlevlerinde açık dönüş türü gerektirmesidir . Ve bu, dilin ifadesini engelliyor gibi hissediyorum. Ayrıca bu gereksinimle programlamak da zordur. Belki de Javascript ve Ruby konfor bölgesinden geldiğim için. Ancak Scala gibi bir uygulamada tonlarca bağlı fonksiyona sahip olacak bir dil için, kafamda nasıl yazdığım özel fonksiyonun özyinelemeden sonra özyineleme ile geri dönmesi gerektiğini tam olarak nasıl beyin fırtınası yaptığımı düşünemiyorum.

Bu işlevler üzerinde açık dönüş türü bildirimi gereksinimi, Java ve C ++ gibi diller için beni rahatsız etmeyin. Java ve C ++ 'da yinelemeler, gerçekleştiklerinde, genellikle en fazla 2 ila 3 işlevle ele alındı. Asla Scala gibi zincirlenmiş birkaç fonksiyon.

Bu yüzden sanırım Scala'nın neden açık dönüş tipine sahip fonksiyonlara sahip olması gerektiğinin iyi bir nedeni olup olmadığını merak ediyorum?


5
Olmaz - ve eğer öyleyse neden bir sorun olacağını göremiyorum.
Keith Thompson

1
Öyle olduğunu düşündüm. Scala'da bir işlevin dönüş türünün gerçekten belirsiz olduğu durumlar var mı?
çöp toplama

Yanıtlar:


15

Scala, tüm işlevlerde açık bir dönüş türü gerektirmez , yalnızca özyinelemeli işlevler gerektirir . Bunun nedeni, Scala'nın tür çıkarsama algoritmasının, başından sonuna kadar, ileriye bakamayacak kadar basit bir tarama olmasıdır.

Bu, şöyle bir işlev anlamına gelir:

def fortuneCookieJoke(message: String) = message + " in bed."

Scala derleyicisi mantık değişkenlerini kullanmadan veya yöntemin parametreleri dışında herhangi bir şeye bakmadan açıkça görebildiğinden, dönüş türünün olması gerektiği için bir dönüş türüne ihtiyaç yoktur String.

Öte yandan, böyle bir işlev:

def mapInts(f: (Int) => Int, l: List[Int]) = l match {
  case Nil => Nil
  case x :: xs => f(x) :: mapInts(f, xs)
}

derleme zamanı hatasına neden olur, çünkü Scala derleyicisi, ileri veya mantık değişkenlerini kullanmadan tam olarak ne olduğunu göremez mapInts. Söyleyebileceği en fazla şey, eğer yeterince akıllı olsaydı, geri dönüş türünün bir süper tür olmasıdır List[Nothing], çünkü Nilbu türden. Bu, dönüş türünü doğru bir şekilde belirlemek için yeterli bilgiye yakın bir yerde vermez mapInts.

Bunun Scala'ya özgü olduğunu ve çok daha kapsamlı ve yetenekli tür çıkarım algoritmaları kullanan diğer statik olarak yazılmış diller (Miranda / Haskell / Clean ailesinin çoğu, ML ailesinin çoğu ve birkaç dağınık diğerleri) olduğunu lütfen unutmayın. Scala'nın kullandığından daha fazla. Ayrıca, bunun tamamen Scala'nın hatası olmadığını unutmayın; nominal alt tipleme ve tüm modül tipi çıkarım temelde birbiriyle çelişmektedir ve Scala tasarımcıları Java uyumluluğu uğruna ikincisine tercih etmeyi tercih ederken, "daha saf" statik olarak yazılan fonksiyonel diller çoğunlukla akılda zıt seçim.


4
Aslında, sorun çok daha kapsamlı bir tür çıkarım algoritması bulmak değildir. Mevcut Scala derleyicisindeki hata mesajlarının yüksek kalitesini korurken , daha kapsamlı bir tür çıkarım algoritması buluyor.
Jörg W Mittag

1
Doğru dönüş case Nilaslında boş olmaz List[Int]()mı? Bu durumda, yeterince akıllı bir derleyici bunu anlayabilir. Sanırım hepsi Devil's Advocate oynuyor.
KChaloux
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.