Ответ 1
Я думаю, что (б), вероятно, самый идиоматический, по той же причине @Ramon дал.
Я думаю, что недостаток Seq.tryHead
означает, что он не слишком распространен.
Я не уверен, но я предполагаю, что функциональные языки с выводами типа Хиндли-Милнера в целом редко используются для реализации таких конкретных функций в типах сбора, потому что перегрузка недоступна, а составные функции более высокого порядка могут выполняться кратко,
Например, расширения С# 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