有一个常见问题是 F#本身不支持中缀样式使用 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
PS 也欢迎各种编码技巧,因为我相信好的技巧(当 F# 开发团队检查时)可以成为未来语言的一部分。