Julia Dili ile İşlevsel Düşünceler - 2. Kısım

Jan 05 2023
Julia ile işlevsel programlamayı keşfetme (Bölüm 2) Bir önceki makalem olan Julia Language ile İşlevsel Düşünce — Bölüm 1'de, Julia ile işlevsel düşünmeye başlamak için bazı temel kavramları tanıttım. Şimdi bu keşfe birkaç konseptle devam ediyoruz.

Julia ile işlevsel programlamayı keşfetme (Bölüm 2)

Önceki makalem Julia Language ile İşlevsel Düşünce — Bölüm 1'de , Julia ile işlevsel düşünmeye başlamak için bazı temel kavramları tanıttım. Şimdi bu keşfe birkaç konseptle devam ediyoruz.

Julia ile işlevsel düşüncelerimizin ikinci kısmı için, Julia'da uygulanabilecek bazı gelişmiş işlevsel programlama kavramlarını daha derinlemesine inceleyeceğiz. İşlevsel programlamada sıklıkla kullanılan bir kavram, bir işlevi kendisi açısından tanımlamayı içeren özyinelemedir.

özyineleme

Yinelenen bir Evren…

İlk olarak, özyineleme kullanmadan, zorunlu olarak yazılmış aşağıdaki işlevi ele alalım:

Yukarıdaki işlev beklendiği gibi çalışır. Ancak, belirtmek istediğim birkaç şey var: for döngüsü `i` değişkenini değiştirir. Değişkenler ave bhatta dizinin kendisi bile her yinelemede mutasyona uğrar. Bunlar, bu makalenin ilk bölümünde ele aldığımız yan etkiler olarak kabul edilir. İşlevsel programlamada, durumu değiştirmek yerine işlevlerden değerler döndürerek işleri başarmak istiyoruz.

Peki yukarıdaki fonksiyonu daha işlevsel bir şekilde nasıl yazabiliriz? Özyinelemeyi kullanabiliriz:

Çok konuşulmayan başka bir kavram, ancak fonksiyonları doğru bir şekilde anlamak ve programlamak için kritik öneme sahiptir: if-then-else dalları ve fonksiyon argümanlarının değerlendirilmesi.

İşlevsel Bir Bükülme

Yinelemeli olarak yazılmış aşağıdaki faktöriyel işlevi göz önünde bulundurun:

Bu işlevi çağırırsak, beklendiği gibi geri döner. İlk kez kullandığımız için dönüş değerini de doğrulayabiliriz:

Şimdi işin püf noktası burada. Kendi if-then-else işlevimi kullanmak istiyorum, bu yüzden yazmaya karar verdim:

İlk bakışta, yukarıdaki if işlevi biraz aptalca ve safça olsa da iyi görünüyor. Normal if dalının etrafındaki bir sarmalayıcı gibi görünüyor.

If fonksiyonumu kullanmak için yukarıdaki faktöriyel fonksiyonu değiştireceğim. Bu şekilde daha özlü ve daha iyi görünecek (bence):

Yukarıdakiyle aynı argümanla yürütmeye çalıştığımda, makinemde aşağıdakileri alıyorum:

Burada neler oluyor?

Julia'da ve çoğu programlama dilinde, bir işlevi çağırdığımızda, işlev gövdesi değerlendirilmeden önce işlev bağımsız değişkenleri değerlendirilir. İşlevin her bağımsız değişkeni tam olarak bir kez değerlendirilir.

Bunu bir if-then-else dalı ile karşılaştırın. Bu dallarla, mantığa göre yalnızca doğru veya yanlış dallar değerlendirilir, ikisi birden değil.

Yukarıdaki factorial_bad işlevi asla geri dönmez çünkü myif_bad çağrıldığında , işlevin doğru ve yanlış ifadeler dahil tüm bağımsız değişkenleri değerlendirildi ve bu, hiçbir zaman sonlanmayan factorial_bad özyinelemeli çağrılarla sonuçlandı . Bunun doğru çalışması için yalnızca biri veya diğeri değerlendirilebilir, ancak ikisi birden değerlendirilemez.

Peki myif_bad işlevini factorial_bad ile nasıl çalıştırabiliriz ?

Yukarıda gösterilen myif ve factorial işlevlerinde aşağıdaki revizyonları göz önünde bulundurun :

Bir dakika... burada neler oluyor? Bu hile nasıl çalışır?

Doğru ve yanlış ifadeler için bağımsız değişkenleri yeni myif_not_too_bad üzerinde sıfır bağımsız değişken işlevleriyle değiştirdim . Sıfır argüman işlev çağrıları, gövdeyi yalnızca gerçekten çağrıldıklarında değerlendirir. Bu işlevin argümanı olmadığı için sadece koşul ifadesi argümanı değerlendirilir ve çok hızlı bir şekilde değerlendirilir.

Yeni factorial_not_too_bad işlevinde, sıfır bağımsız değişken alan lambda ifadeleri oluşturdum. Dolayısıyla, doğru şube bu lambda ifadelerini gerçekten çağırana kadar yürütülmeyecekler. Doğru if-then şubesi lambda ifadesini çağırır ve her şey amaçlandığı gibi yürütülür:

Bir şeyin hemen yürütülmesini istemiyorsanız, ya işlevin tüm bağımsız değişkenlerini gövdeden önce değerlendirmek istemediğiniz için ya da bunu her zaman yürütmeyle ilişkili pahalı hesaplama maliyetleri olabileceğinden, sıfıra koyun. -argument lambda ifadesi ve onu saklayın — doğru kapanışı oluşturun, ardından sonuçlara ihtiyacınız olduğunda onu arayın, daha önce değil.

Bunun üzerine meditasyon yap. Yukarıdaki kavramlara dayanan birkaç işlevsel programlama yapısı vardır: tembel değerlendirmeler, kapanışlar, değişmez akışlar ve diğer birçok işlevsel fikir.