среда, 10 августа 2011 г.

Перенимаем лучшее или заменяем "return ()" в Haskell

Однажды просматривая примеры кода на Curry, я увидел одну замечательную мелочь, о которой хотел бы вам поведать.

Возможно вы это оцените.


Сам язык очень сильно похож на Haskell, во многом идентичен. Вот пример Curry кода:
-- a simple echo:
echo = getChar >>= \c -> if ord c == (-1) then done else putChar c >> echo

Как видите, от Haskell практически не отличить. Но, как вы наверное уже заметили, на месте всем привычного "return ()" стоит "done".

Лично я считаю это очень красивым и элегантным решением, поэтому очень быстро реализовал это и в Haskell:
done :: (Monad m) => m ()
done = return ()

Преимущества использования done очевидны: меньше символов, элегантно, красиво.
Минусы кроются только в одном - done не используется в Haskell-community. Поначалу это может сбивать с толка. Но я думаю, что это поправимо.

Хотелось бы услышать еще мнения, возможно я что-то упустил.
Если же все учтено, то необходимо искать способы включения done в стандартную библиотеку (Prelude, Control.Monad?).
Ведь что плохого в том, чтобы перенимать лучшее у других, пускай это и такая мелочь?

P.S. Для приведенного примера, Haskell имеет замечательную функцию when, которая значительно уменьшит код. Но конструкция "return ()" довольно часто встречается в Haskell коде и еще чаще от нее нельзя избавиться с помощью when/until.

9 комментариев:

  1. Я считаю, что в данном случае получаемый сonvenience маловат, а слово несколько запутывает понимание семантики операции. Точно так же запутывает "return" и мне кажется, что его хорошо бы переименовать во "wrap".

    ОтветитьУдалить
  2. Разве return это не наоброт - unwrap?

    ОтветитьУдалить
  3. >Разве return это не наоброт - unwrap?
    "return" ведь именно оборачивает значение в монаду.
    x :: IO Int
    x = return 2
    f :: IO (Maybe Int)
    f = return $ Just 5 -- Maybe стала bottom монадой

    >переименовать во "wrap"
    Это было бы значительно лучше, но это не отменит преимуществ "done". "wrap ()" звучит также глупо, как и "return ()".

    ОтветитьУдалить
  4. http://pastebin.com/w4Cgmch8 - return не нужен. Что я делаю не так?

    ОтветитьУдалить
  5. Есть же void и when.

    ОтветитьУдалить
  6. @afiskon,
    Вы привели конкретный пример.
    Посмотрите этот код:
    http://hackage.haskell.org/packages/archive/mongoDB/1.0.1/doc/html/src/Database-MongoDB-Query.html

    @voidex.org,
    "when" и "void" не всегда можно использовать. Например http://hpaste.org/50122.

    ОтветитьУдалить
  7. Это же никакое не «оборачивание» значения в монаду. По этому return и только. Для аплиативных функторов есть ф-ия pure, она отражает чуть еще лучше.

    ОтветитьУдалить
  8. >> Преимущества использования done очевидны: меньше символов, элегантно

    LOL

    ОтветитьУдалить
    Ответы
    1. Хаха, сделайте скидку на молодость автора :-D

      Удалить