2015-05-07 6 views
9

Ниже приведен фрагмент кода из here, и из контекста я понимаю, что он делает с помощью сопоставления с образцом, но как он это делает, и этот оператор (ы) имеет меня для цикла. MSDN не помогло. Если это оператор, имеет ли он имя? Извините, если есть некоторые недостающие google fu с моей стороны.Что такое F # колдовство (> =>)?

let (>=>) f1 f2 arg = 
    match f1 arg with 
    | Ok data -> f2 data 
    | Error e -> Error e 

UPDATE: Действительно, это может быть так, что перегружен оператор, и спасибо за ссылку на другой SO вопрос, я думаю, суть моего вопроса было то, что является то, что семантика перегруженных оператора. Глядя на другие ссылки (>> =), кажется типичным оператором связывания.

+4

Возможно, вы должны прочитать статью [this] (http://fsharpforfunandprofit.com/posts/recipe-part2/) по железнодорожному ориентированному программированию, она объяснит это лучше, чем я могу в ответ. – DaveShaw

+0

Возможный дубликат [Можете ли вы определить свои собственные операторы в F #?] (Http://stackoverflow.com/questions/2210854/can-you-define-your-own-operators-in-f) – Euphoric

+1

https: // www .haskell.org/hoogle /? hoogle =% 3E% 3D% 3E –

ответ

14

Это Kleisli Состав Оператор для монадов. Это позволяет вам составлять функции «фигуры» 'a -> M<'b> и 'b -> M<'c'>, где M является монадическим: в вашем случае Result<'t> из связанной статьи.

>=> действительно просто функция композиции, но >> не будет работать здесь, так как тип возврата первой функции не аргумент второй - он обернут в Result<'t> и должна быть развернута, что как раз то, что >=> осуществление.


Это может быть определено в терминах >>=, а также:

let (>=>) f1 f2 arg = 
    f1 arg >>= f2 

кажется, что пакет Control.Monad Haskell использует это определение. Полный тип подписи также может быть полезным (взято из here):

-- | Left-to-right Kleisli composition of monads. 
(>=>)  :: Monad m => (a -> m b) -> (b -> m c) -> (a -> m c) 
f >=> g  = \x -> f x >>= g 

Еще один забавный факт, что Клейсли состав делает три monad laws легче выразить только с помощью функции (и, на мой взгляд, это делает их гораздо яснее):

  • Левая идентичность: return >=> g ≡ g
  • Право личности: f >=> return ≡ f
  • Ассоциативность: (f >=> g) >=> h ≡ f >=> (g >=> h)
+0

Спасибо за ответ, я собираюсь потратить минуту и ​​попытаюсь переварить это. Я просто хотел подтвердить, что тройной бар - это не равенство или назначение, а определение? Кроме того, как вы пишете этот символ в SO? –

+1

Тройной бар '≡' является экстенсиональным равенством в этом случае. Для * чистых * функций это означает, что если вы предоставите один и тот же вход для левой и правой сторон, вы получите тот же результат от обоих. –

+0

Спасибо, это, наконец, имело смысл, когда я увидел, как он относится к операции привязки. – CodeMonkey

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