Skip to content

Commit

Permalink
Monoid, semigroup, monad examples
Browse files Browse the repository at this point in the history
  • Loading branch information
mrtkp9993 committed Jul 2, 2018
1 parent 85ba786 commit 39340b2
Showing 1 changed file with 60 additions and 4 deletions.
64 changes: 60 additions & 4 deletions readme.md
Original file line number Diff line number Diff line change
Expand Up @@ -221,7 +221,7 @@ Aşağıdaki tabloda bir kaç kategori örneği verilmiştir.

**Hask**, Haskell tiplerinin ve fonksiyonlarının bir kategorisidir.

**Hask** kategorisinin nesneleri Haskell'deki _tipler_, ```A``` nesnesinden ```B``` nesnesine tanımlı morfizmalar ise ```A -> B``` şeklindeki fonksiyonlardır.
**Hask** kategorisinin nesneleri Haskell'deki _tipler_, ```A``` nesnesinden ```B``` nesnesine tanımlı morfizmalar ise ```A -> B``` şeklindeki fonksiyonlardır.


__Daha Fazla Kaynak__
Expand All @@ -239,6 +239,51 @@ _Morfizma_, bir kategorideki iki nesne arasındaki eşlemedir.
5. Bir nesneden kendisine ve örten morfizmalar, _endomorfizma_ olarak adlandırılır.
6. Bir nesneden kendisine isomorfizmalar, _otomorfizma_ olarak adlandırılır.

## Monoid

_Monoid_, geçişken bir ikili işleme ve birim elemana sahip bir yapıdır.

### Haskell'de monoidler

Haskell'de monoidler aşağıdaki şekilde tanımlanır:

```haskell
class Monoid m where
mempty :: m
mappend :: m -> m -> m
mconcat :: [m] -> m
mconcat = foldr mappend mempty
```

En basit monoid örneği, birleştirme (concatenation) işlemi ile birlikte listelerdir:

```haskell
instance Monoid [a] where
mempty = []
mappend x y = x ++ y
mconcat = concat
```

## Yarıgrup (Semigroup)

Yarıgrup, geçişken bir ikili işleme sahip bir yapıdır. Dolayısıyla, monoidler, yarıgrupların bir altkümesidir.

### Haskell'de Semigruplar

```haskell
class Semigroup a where
(<>) :: a -> a -> a
sconcat :: [[Data.List.Nonempty|Nonempty]] a -> a
stimes :: Integral b => b -> a -> a
```

Bir örnek verirsek,

```
Sum 3 <> Sum 4 -- "Sum a" tipi ile birlikte, "<>" ikili işlemi "+" işlemine dönüşür
-- Sum {getSum = 7}
```
## Functor
![](./src/c.png) ve ![](./src/d.png) iki kategori olsun. Bir ![](./src/fCD.png) funktoru
Expand All @@ -259,7 +304,7 @@ class Functor f where

## Applicative Functor

Applicative functor, funktor ve monad arasında konumlanan ve
Applicative functor, funktor ve monad arasında konumlanan ve

```
pure id <*> v = v -- Identity
Expand All @@ -280,7 +325,7 @@ class (Functor f) => Applicative f where

## Monad

Bir ![](src/MCC.png) funktoru verilsin. ![](src/c.png) kategorisindeki her ![](src/bigX.png) nesnesi için
Bir ![](src/MCC.png) funktoru verilsin. ![](src/c.png) kategorisindeki her ![](src/bigX.png) nesnesi için
- ![](src/unitMX.png)
- ![](src/joinMX.png)
morfizmalarını tanımlayalım. ```M``` funktoru, ```unit``` ve ```join``` morfizmaları ile birlikte bir _monad_ olarak adlandırılır.
Expand All @@ -289,6 +334,17 @@ morfizmalarını tanımlayalım. ```M``` funktoru, ```unit``` ve ```join``` morf

Monadlar, bir araya getirilebilen hesaplama adımları olarak düşünülebilirler. Ayrıca monadlar, saf hesaplamalara G/Ç, ortak ortam, güncellenebilir durumlar vb. özellikler ekler.

En sık kullanılan monadlar:
* Identity: Monad dönüştürücüleri ile birlikte kullanılırlar.
* Maybe: Bir sonuç dönmeyebilecek hesaplamalar için kullanılırlar.
* Error: Bir hata verebilecek hesaplamalar için kullanılırlar.
* List: Non-deterministik hesaplamalar yapmak için kullanılırlar.
* IO: G/Ç işlemleri için kullanılırlar.
* State: Bir durumun (state) sürdürülmesi gereken hesaplar için kullanılırlar.
* Reader: Paylaşılan bir ortamdan girdi okumak için kullanılırlar.
* Writer: Bir ortama sonuçları yazmak için kullanılırlar.
* Cont: Yarıda kesilebilecek/ yeniden başlatılabilecek hesaplamalar için kullanılırlar.

## Algebraic data type

Cebirsel veri tipleri, bileşik tiplerdir - diğer tiplerin bir araya getirilmesiyle oluşurlar.
Expand All @@ -302,7 +358,7 @@ Toplamsal tipler, basit olarak `veya` bağlacı ile oluşturulan tipler denilebi
```haskell
data Bool = False | True
```
Bu tanım şunu söylemektedir: Bir `Bool`, `False` veya `True` değerlerinden herhangi birini alabilir.
Bu tanım şunu söylemektedir: Bir `Bool`, `False` veya `True` değerlerinden herhangi birini alabilir.

### Product type

Expand Down

0 comments on commit 39340b2

Please sign in to comment.