Подтвердить что ты не робот

Какие-нибудь преимущества для Haskell desugaring?

Когда я использую Функторы, Монады и другие конструкции Хакелла, если мой код больше, чем просто несколько строк, я предпочитаю использовать какой-то синтаксический сахар, как do-notation. Это облегчает мне отслеживание потока кода. Вне стилистических предпочтений, есть ли реальное преимущество в использовании блоков de-sugared в отличие от сахаридной альтернативы?

4b9b3361

Ответ 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 не может зависеть от первого. Это подвиг, который монадическое связывание не может дублировать, потому что действие, вычисленное во втором аргументе привязки, может зависеть от результата вычисления в первом аргументе.

Разработка нового типа сахара, который позволяет такую ​​оптимизацию, является актуальным вопросом исследования на данный момент, насколько мне известно.

Ответ 2

Ну нет. Весь смысл сахарирования заключается в том, что он desugars точно в desugared версии, поэтому не может быть никаких не стилистических преимуществ. Для вас может быть полезно привыкнуть к десугатной нотации, чтобы вы могли следить за ней, когда она стилистически понятна, но вы не получите каких-либо преимуществ в производительности или что-то еще, потому что код идентичен.

Ответ 3

Даниэль утверждает, что для десурагирования с точки зрения производительности, амаллоя утверждает, что он не обессурит с точки зрения удобочитаемости.

Я бы предположил, что иногда десугатная версия является более читаемой, т.е. сравнивает

echo :: IO ()
echo = do
  ln <- getLine
  putStrLn ln

to

echo :: IO ()
echo = putStrLn =<< getLine