История изменений
Исправление 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")
Какой вариант удобнее читать? Какой вариант удобнее писать? Какой вариант будет проще понять человеку который ни разу не слышал про Функторы и Аппликативы.