Существует обычная проблема: F # не поддерживает в стиле infix-стиле функции, доступные в Haskell:
isInfixOf :: Eq a => [a] -> [a] -> Bool
isInfixOf "bar" "foobarbaz"
"bar" `isInfixOf` "foobarbaz"
Наиболее известное решение для F # можно найти здесь:
let isInfixOf (what:string) (where:string) =
where.IndexOf(what, StringComparison.OrdinalIgnoreCase) >= 0
let found = "bar" |>isInfixOf<| "foobarbaz"
Кроме того, его легко немного улучшить, используя приоритет собственных операторов:
let ($) = (|>)
let (&) = (<|)
let found = "bar" $isInfixOf& "foobarbaz"
Также существует XML-ish </style/>
, описанный здесь.
Я хотел бы найти лучшее решение со следующими критериями:
- Оператор одиночного символа (или пара), который не уничтожает обычно используемые операторы;
- В Haskell должен присутствовать один и тот же символ, так же как и символ серьезного акцента (обратной цитаты);
-
Он не должен уничтожать ассоциативность (цепочка поддержки):
let found = "barZZZ" |>truncateAt<| 3 |>isInfixOf<| "foobarbaz"
-
Необязательно, он должен поддерживать функции, берущие кортежи:
let isInfixOf (what:string, where:string) = ... // it will not work with |> and <|
-
Необязательно, он должен изящно обрабатывать функции /3:
val f: 'a -> 'b -> 'c -> 'd = ... let curried = a |>f<| b c // this wouldn't compile as the compiler would attempt to apply b(c) first
P.S. Различные трюки для кодирования также приветствуются, поскольку я считаю, что хороший (когда проверяется командой F # Dev) может быть частью языка в будущем.