@aldrael: W połączeniu za pattern matchingiem można pisać kod w bardzo zwięzły sposób:

with(list){
() -> nil
(H | T) -> {consume(H); recurse(T)}
}

Tego bez krotek (niejawna (H|T) ) raczej nie ogarniesz.

Co więcej w językach czysto funkcyjnych, gdzie nie masz obiektów ani struktur to krotki pozwalają na składowanie danych w ramach struktur. Przydają się też gdy chcesz uzyskać coś w rodzaju typu ad hoc np. przy odczycie pliku CSV
  • Odpowiedz
@g500s: nie jest to rekurencja ogonkowa, poniewaz nie mozesz zewaluowac wartosci w tym wywolaniu, tym samym na stosie wywolan funkcji to dzialanie bedzie odlozone na pozniej. Doprowadzi to do przepelnienia stosu jesli popsujesz warunek stopu.

W rekurencji ogonkowej do kolejnego wywolania funkcji przekazujesz caly stan tak ze nie musisz odkladac na stosie stanu poprzedniego.

Taka zmiana jak

return fac((i - 1) * i) powoduje ze przekazujesz cale dzialanie dalej i nie
  • Odpowiedz
@M4ks: LOL, chodziło mi, że jest za dużo treści na jednej stronie i ciężko się przewija, bo pasek do przewijania jest taki malutki :s Próbowałem znaleźć ciekawe dla mnie artykuły i poległem na przewijaniu strony.
  • Odpowiedz
@MacDada:

1. Jeżeli metoda jest zaimplementowana w klasie rozszerzającej/implementującej to nie zostanie nadpisana.
2. Jeżeli klasa rozszerza inną klasę i implementuje interfejs, w wyniku czego mamy konflikt nazw, to nic się nie stanie. Kotlin posiada "optymistyczne rzutowanie", czyli jeżeli obiekt ma metodę o danej nazwie to uznaje się, że można go bezpiecznie rzutować na dany typ:

fun main(args: Array) {
val i:I = SubC();
i.m()
}

interface I{
fun m();
}
  • Odpowiedz