У меня есть список имен, и мне нужно вывести одну строку, которая показывает буквы из имен в порядке их появления без дубликатов (например, если список равен ["John"; "James"; "Jack"]
, строка вывода должна быть Johnamesck
).У меня есть решение (сворачивать все имена в строку, а затем анализировать), но я чувствую, что я немного ее проверяю, делая свою строку изменчивой.
Я также хочу заявить, что это не школьное задание, а упражнение от коллеги по работе, поскольку я вхожу в F # только из тех, кто когда-либо знал, что такое Java Web.
Вот моя работарешение (для ознакомления):
let lower = ['a' .. 'z']
let upper = ['A' .. 'Z']
let mutable concatedNames = ["John"; "James"; "Jack"] |> List.fold (+) ""
let greaterThanOne (length : int) = length > 1
let stripChars (str : string) letter =
let parts = str.Split([| letter |])
match greaterThanOne (Array.length parts) with
| true -> seq {
yield Array.head parts
yield string letter
yield! Array.tail parts
}
|> String.concat ""
| _ -> str
let killAllButFirstLower = lower |> List.iter (fun letter -> concatedNames <- (stripChars concatedNames letter))
let killAllButFirstUpper = upper |> List.iter ( fun letter -> concatedNames <- (stripChars concatedNames letter))
printfn "All names with duplicate letters removed: %s" concatedNames
Первоначально я хотел сделать это явно с помощью одних функций, и у меня было решение, предшествующее описанному выше
let lower = ['a' .. 'z']
let upper = ['A' .. 'Z']
:
:
:
let lowerStripped = [""]
let killLowerDuplicates = lower |> List.iter (fun letter ->
match lowerStripped.Length with
| 1 ->
(stripChars concatedNames letter)::lowerStripped |> ignore
| _ -> (stripChars (List.head lowerStripped) letter)::lowerStripped |> ignore
)
let upperStripped = [List.head lowerStripped]
let killUpperDuplicates = lower |> List.iter ( fun letter -> (stripChars (List.head upperStripped) letter)::upperStripped |> ignore )
let strippedAll = List.head upperStripped
printfn "%s" strippedAll
Но я не мог заставить это работатьпотому что я понял, что списанные списки никуда не денутся (не говоря уже о том, что это, вероятно, неэффективно).Идея заключалась в том, что, делая это таким образом, как только я все проанализирую, первым элементом списка будет желаемая строка.
Я понимаю, что может быть странно задавать вопрос, решение которого у меня уже есть, ноЯ чувствую, что использование mutable
- это просто то, что я не отпускаю свои императивные привычки (как я читал, это редко нужно использовать), и я хочу усилить чистый функционал.Так есть ли лучший способ сделать это?Является ли второе решение возможным путем, если я могу каким-то образом передать результат куда-нибудь?