LINUX.ORG.RU

История изменений

Исправление zinfandel, (текущая версия) :

Не вижу проблемы.

Когда я вижу fmap, мне нужно знать, что этот fmap означает, точно так же как мне нужно знать что означает его синоним <$>. Когда я вижу ap мне нужно знать, что этот ap означает, точно так же как мне нужно знать что означает его синоним <*>.

А теперь сравни два куска кода.

Без операторов:

parseJSON (Object o) = User `fmap` o .: "name"
                              `ap` o .: "age"
                              `ap` o .: "rating"

С операторами:

parseJSON (Object o) = User <$> o .: "name" 
                            <*> o .: "age"
                            <*> o .: "rating"

И напоследок, вива лисп:

parseJSON (Object o) = ap (ap (fmap Person (o .: "name")) 
                                           (o .: "age"))
                                           (o .: "rating")

Какой вариант удобнее читать? Какой вариант удобнее писать? Какой вариант будет проще понять человеку который ни разу не слышал про Функторы и Аппликативы?

Исходная версия zinfandel, :

Не вижу проблемы.

Когда я вижу fmap, мне нужно знать, что этот fmap означает, точно так же как мне нужно знать что означает его синоним <$>. Когда я вижу ap мне нужно знать, что этот ap означает, точно так же как мне нужно знать что означает его синоним <*>.

А теперь сравни два куска кода.

Без операторов:

parseJSON (Object o) = User `fmap` o .: "name"
                              `ap` o .: "age"
                              `ap` o .: "rating"

С операторами:

parseJSON (Object o) = User <$> o .: "name" 
                            <*> o .: "age"
                            <*> o .: "rating"

И напоследок, вива лисп:

parseJSON (Object o) = ap (ap (fmap Person (o .: "name")) 
                                           (o .: "age"))
                                           (o .: "rating")

Какой вариант удобнее читать? Какой вариант удобнее писать? Какой вариант будет проще понять человеку который ни разу не слышал про Функторы и Аппликативы.