Не получить тот же результат при частичном применении, как при использовании инфиксного оператора "(%) x y <> x% y -> wtf" - PullRequest
0 голосов
/ 02 июня 2019

Я только что проверил значение, чтобы увидеть, что это продукт из трех. Отлично использовать функцию модуля. Я хочу, чтобы труба к этому. Отлично использовать частичное применение. Но, видимо, нет.

Это пример из моего fsi в коде.

> 27 % 3
-
- ;;
val it : int = 0

> (%) 3 27
- ;;
val it : int = 3

Я действительно не ожидал получить другой результат от инфикса против частичного.

Вот операция в канале для контекста:

...
|> Seq.length // 27
|> (%) 3 // 3

Ответы [ 2 ]

6 голосов
/ 02 июня 2019

Потому что у вас опущены операнды. (%) 3 27 на самом деле означает 3 % 27, а не 27 % 3, т.е. вы хотите (%) 27 3.

3 голосов
/ 02 июня 2019

Частичное применение инфикса не работает, как я ожидал.Утверждение в моем вопросе неверно, и это не ошибка.Это может быть довольно распространенное недоразумение для начинающих, поэтому оно заслуживает хорошего объяснения.

(%) x y = x % y

Поэтому

 (%) 27 3
 = 27 % 3
 = 0

Путаница возникает, когда вы получаете окончательное значение y.Вы не должны ожидать, что

y
|> (%) x

приведет к

 y % x

, а скорее

x % y

Это немного сбивает с толку, особенно если вы использовали инфиксный оператор, который обрабатывает входные данные симметрично (например, +, =, <>, *), не задавая вопросов слишком глубоко.Вы должны позаботиться о том, чтобы порядок значений, передаваемых инфиксному оператору, был правильным, даже если он выглядит правильно при первой проверке.

Самый простой и подробный способ обработки инфиксного оператора, который принимает значения в обратном порядке.на что вы хотите их поставить, это просто выписать лямбду.Тем не менее, есть также опция для обратного канала '<|'. </p>

Вот фрагмент кода, который вызывал у меня ошибку из-за неправильного использования частично примененного инфикса.

...
|> Seq.length // 27
|> (%) 3 // 3 % 27 = 3

Он может быть записан с помощью backpipe, чтобы работать как положено

...
|> Seq.length // 27
|> (%) <|3 // 27 % 3 = 0

или более четко с лямбда

...
|> Seq.length // 27
|> (fun x -> x % 3 // 27 % 3 = 0
...