Возможно вы это оцените.
Сам язык очень сильно похож на 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.
Я считаю, что в данном случае получаемый сonvenience маловат, а слово несколько запутывает понимание семантики операции. Точно так же запутывает "return" и мне кажется, что его хорошо бы переименовать во "wrap".
ОтветитьУдалитьРазве return это не наоброт - unwrap?
ОтветитьУдалить>Разве return это не наоброт - unwrap?
ОтветитьУдалить"return" ведь именно оборачивает значение в монаду.
x :: IO Int
x = return 2
f :: IO (Maybe Int)
f = return $ Just 5 -- Maybe стала bottom монадой
>переименовать во "wrap"
Это было бы значительно лучше, но это не отменит преимуществ "done". "wrap ()" звучит также глупо, как и "return ()".
http://pastebin.com/w4Cgmch8 - return не нужен. Что я делаю не так?
ОтветитьУдалитьЕсть же void и when.
ОтветитьУдалить@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.
Это же никакое не «оборачивание» значения в монаду. По этому return и только. Для аплиативных функторов есть ф-ия pure, она отражает чуть еще лучше.
ОтветитьУдалить>> Преимущества использования done очевидны: меньше символов, элегантно
ОтветитьУдалитьLOL
Хаха, сделайте скидку на молодость автора :-D
Удалить