Я думаю, что (б), вероятно, самый идиоматичный, по той же причине, что и @Ramon.
Я думаю, что отсутствие Seq.tryHead
просто означает, что это не супер распространено.
Я не уверен, но я предполагаю, что функциональные языки с логическим выводом типов Хиндли-Милнера вообще редко используют такие специфические функции для типов коллекций, потому что перегрузка недоступна, и составление функций более высокого порядка может быть выполнено кратко ,
Например, расширения C # Linq являются гораздо более исчерпывающими, чем функции в модуле F # Seq
(который сам по себе является более исчерпывающим, чем функции в конкретных типах коллекций), и даже имеет IEnumerable.FirstOrDefault
. Практически каждая перегрузка имеет изменение, которое выполняет map
.
Я думаю, что акцент на сопоставление с образцом и конкретные типы, такие как list
, также является причиной.
Теперь, большинство из вышеперечисленных является спекуляцией, но я думаю, что у меня может быть понятие, более близкое к объективности. Я думаю, что большую часть времени tryPick
и tryFind
можно использовать в первую очередь вместо filter |> tryHead
. Например, я довольно часто пишу код, подобный следующему:
open System.Reflection
let ty = typeof<System.String> //suppose this type is actually unknown at compile time
seq {
for name in ["a";"b";"c"] do
yield ty.GetMethod(name)
} |> Seq.tryFind((<>)null)
вместо
...
seq {
for name in ["a";"b";"c"] do
match ty.GetMethod(name) with
| null -> ()
| mi -> yield mi
} |> tryHead