Functor nedir haskell

Posted on Oct 28, 2019

Son bir kaç aydır Haskell öğrenmeye çalışıyorum. Neden böyle bir maceraya giriştiğimle ilgili bir yazı yazmak istiyorum ilerde.

Şimdilik öğrendiğimi düşündüğüm konuları hem not etmek, hem de türkçe kaynak oluşturmuş olabilmek adına, olabildiğince bloguma eklemeye çalışacağım.

Functor, Haskell’de bir TypeClass olarak tanımlanmıştır. Yaptığı iş, kapsayıcıya/kapsama (context) müdahale etmeden, içerdeki veride işlem yapabilmeye olanak sağlamaktır.

Basitçe toplama işlemi için (+3) 2 dediğimizde, 2 ile 3 ile toplayan fonksiyonu işleme sokarak 5 sonucuna ulaşmış oluyoruz. + iki argüman bekleyen bir fonksiyon olduğu için birinci fonksiyonu vererek 3 ile toplayan fonksiyona çevirme işlemine currying deniyor. Başka bir yazıda detaylıca gireceğim.

Ancak contexte müdahale etmeden işlem yapmak istediğimiz zamanlar olacaktır. Örneğin; Haskell’de Maybe adında bir type mevcut. Just ile kapsanmış bir değer yahut Nothing değerine sahip olabilir. Eğer elimizde Maybe Int türünde bir Just 2 değeri varsa bunu (+3) fonksiyonumuza nasıl verebiliriz? + fonksiyonu iki argüman bekliyor, ikisi de Num olmalı. Ancak birisi doğruyken diğeri bir kapsayıcı içerisinde.

Üstelik biz işlem sonucunda elimizdeki Just 2 değerinin türünün değişmesini istemiyoruz.

Çok şanslıyız çünkü Maybe türü bir Functor.

Peki bir Functorı nasıl işleme sokabiliriz? Elimizdeki Functorlar ile işlem yapmamız için çok güzel bir fonksiyon var ve adı fmap.

Bir Functor ile işlem yapmak istediğimizde, fmap fonksiyonunu kullanabiliriz. Örneğin; fmap (+3) (Just 2) dediğimizde bize sonuç olarak Just 5 verecek ve kapsayıcımız bozulmamış olacak.

Maybe türü için Functor tanımlaması ise şöyle yapılmış durumda:

instance Functor Maybe where
    fmap func (Just val) = Just (func val)
    fmap func Nothing = Nothing

Gördüğünüz gibi net bir şekilde Functor typeclassından tanımlanmış instancelar ile Functorların fmap fonksiyonu ile nasıl çalışabileceği belirlenmiş durumda. Tüm Functorlar için instancelar bu şekilde tanımlanmıştır. Maybe için eğer beklenen değer Nothing gelirse verilen fonksiyon uygulanmadan Nothing dönmektedir.

Ayrıca Haskell’de listeler de birer Functor instanceına sahiptir. Bunu da diğer yazıda paylaşacağım.

#haskell #tr #functor #functionalprogramming #fonksiyonelprogramlama