Ответ 1
Я считаю, что стыдно, что люди рассматривают этот вопрос как немой, особенно потому, что вопреки самым сильным мнениям, выраженным здесь, ответ да, может быть преимущество, сахар. Саймон Марлоу дает отличный пример этого в своем разговоре о проекте Facebook Haxl, над которым он работает. Здесь короткая, несомненно, забитая версия - определенно посмотрите на его слайды для более подробной информации!
Здесь пример запроса, который может потребоваться Facebook:
numCommonFriends x y = do
fx <- friendsOf x
fy <- friendsOf y
return (length (intersect fx fy))
С сахаром это красиво. К сожалению, он также плохо последователен. Оказывается, вы можете спроектировать Monad, который делает вышеизложенное возможным, но плохо преувеличивающим, а следующая непристойная аппликативная версия значительно более эффективна:
numCommonFriends x y = length <$> liftA2 intersect (friendsOf x) (friendsOf y)
Дело в том, что аппликативный экземпляр запускает сразу две ветки friendsOf: статически ясно, что второй вызов friendsOf
не может зависеть от первого. Это подвиг, который монадическое связывание не может дублировать, потому что действие, вычисленное во втором аргументе привязки, может зависеть от результата вычисления в первом аргументе.
Разработка нового типа сахара, который позволяет такую оптимизацию, является актуальным вопросом исследования на данный момент, насколько мне известно.