2015-05-16 5 views
8

На днях я наткнулся на оператора, -<, появляющегося в контексте привязки значения к переменной в монаде; в частности, похоже, что это передает значение функции, которая затем назначается (и, возможно, оценивается?) на переменную, существующую в области монады.Какая черта «- <», так или иначе?

Пример использования:

myMonad = do 
    myVar <- f -< x 

Несколько вопросов по этому поводу: Во-первых, что это называется? Сам оператор несовместим (Google не любит < или >), и одно имя, которое я нашел, «arrow application», обычно ссылается на the other kind of Arrow present in Haskell, что кажется несвязанным.

Во-вторых, почему этот оператор не объясняется в большинстве учебных ресурсов там? Ни «Нежное введение в монады», ни LYAH не дают его столько, сколько упоминание, и большинство списков операторов Haskell тоже этого не делают. (Является ли это плохой практикой?)

И, наконец, это эквивалентно использованию круглых скобок, как в, (myVar <- f -< x) == (myVar <- (f x))? Или это больше похоже на использование let myVar = (f x)? В любом случае, если это так, как использовать, зачем использовать -< над parens или $?

+1

при поиске символов, [hoogle] (https://www.haskell.org/hoogle/?hoogle=-%3C) и [hayoo] (http://hayoo.fh-wedel.de/?query = -% 3C) - ваши друзья. – rampion

ответ

16

Да, это же стрелка. Существует синтаксис сахара для стрелок, как и синтаксис сахара для монад. Вы не можете использовать Google для поиска -<, но вы можете использовать Hoogle.

GHC Language Features, Arrow tutorial.

Синтаксис Arrow действительно плохо документирован. Причина, по которой вы не можете использовать $ вместо -<, заключается в том, что -< вводит чистое значение в стрелку, но -> - только один пример стрелки. Итак, $ отлично работает, если ваша стрелка ->. Существуют также монадические стрелки (конструктор Kleisli создает их), и вы можете создавать свои собственные стрелки, и в этих случаях -< отличается.

Смежные вопросы