2015-12-28 3 views
3

Только что начал изучать F # и сейчас читаю «The Book Of F #». Возможно, мне что-то не хватает, но насколько я знаю, операторы прямого и обратного конвейеров передают результат выражения в последний параметр следующей функции в прямом/обратном направлении. Но почему это работает? Он проходит y до x (обработка x как функция), затем передайте x y в последний параметр, например. b минус. Поэтому он должен вернуть закрытие не a. Но backwardTest 3 2 возвращает 1.F # оператор обратного конвейера с несколькими параметрами

let backwardTest x y = 
    let minus a b = a - b 
    minus <| x <| y 
+1

Операторы, на самом деле, применить первый аргумент первого. Проверьте [этот вопрос] (http://stackoverflow.com/questions/11378402/partial-function-application-for-a-non-symmetric-operator-using-point-free-style), чтобы увидеть, как мы иногда пытаемся применить * не первый * один в случае асимметричных функций, таких как вычитание, деление или модуль. – bytebuster

+0

Просто перепроверьте раздел о конвейерной обработке в книге, которую я читаю, и хотел бы, чтобы он упомянул об этом; в противном случае было бы естественно думать, что оператор обратного конвейера также передает аргументы справа налево. Спасибо за ссылку, которая проясняет ситуацию дальше! – stt106

+0

Ключ должен перестать думать об этих операторах как о чем-то волшебном. Это обычные функции, как и все остальное. Вы даже можете определить свой собственный. На самом деле, это было бы полезным упражнением, чтобы понять, что происходит. –

ответ

2

поэтому у вас есть

minus <| x <| y 
=minus x <| y 
=(minus x) y 
=minus x y 
+0

О, так что обратный конвейер все еще передает выражения слева направо? Я думал, что он проходит в порядке справа налево. – stt106

+1

Нет, стандартный '' | 'оператор по-прежнему остается ассоциативным, и для определенных целей это полезно. Для правильного ассоциативного оператора, такого как «$' Haskell, см. [Здесь] (http://www.fssnip.net/4o). – TeaDrivenDev

+1

@ stt106, если '<|' были правильными ассоциативными, у вас была бы ошибка компиляции, потому что вы не можете передать int (y) в int (x). Попробуйте 'x |> y |> минус', если вы не понимаете, что я имею в виду, или даже' минус <| (x <| y) '. – phoog

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