Частичное применение инфикса не работает, как я ожидал.Утверждение в моем вопросе неверно, и это не ошибка.Это может быть довольно распространенное недоразумение для начинающих, поэтому оно заслуживает хорошего объяснения.
(%) 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