Оригинальный вопрос
Я хочу использовать F #, чтобы найти близость согласных к гласным в наборе слов.Так, например, в слове «верх» T - это (-1: 1) от гласного, а P - (1: 1) от гласного.
Первое число в паре - это позиция, а второе -число - это число раз, которое оно находится в этой позиции относительно ближайшего гласного.
В «согласных» C - (-1: 1), N - (1: 3), (-2: 1), (-1, 1), S - (2: 1), (-1: 1), (3: 1) и T - (2: 1).
Я подозреваю, что должениспользуйте комбинацию groupBy, findIndex и countBy.
type ConsonantPos = { Name: string
BeforeVowel: int
AfterVowel: int }
let isVowel (x:string) =
List.contains x ["a";"e"; "i"; "o"; "u"]
let consonantPosVsVowel x lst =
let rec getConsonanatPos x beforeVowel afterVowel currentPos lst =
match lst with
| [] -> {Name = x; BeforeVowel = beforeVowel; AfterVowel = afterVowel}
| h::t ->
if isVowel h then
{Name = x; BeforeVowel = beforeVowel; AfterVowel = afterVowel}
else
getConsonanatPos x (beforeVowel - 1) (afterVowel + 1) (currentPos + 1) t
getConsonanatPos x 0 0 0 lst
["b"; "a"; "c"] |> consonantPosVsVowel "b"
// val it : ConsonantPos = {Name = "b"; BeforeVowel = -1; AfterVowel = 1;}
["b"; "c"; "d"; "e"; "f"; "g"] |> consonantPosVsVowel "b"
// val it : ConsonantPos = {Name = "b"; BeforeVowel = -3; AfterVowel = 3;}
Пересмотренное решение
По состоянию на 21/11/2018 оба предложения работали и хорошо работали для решения проблемы, как я изначально указал.
Конечно, этот вопрос был только частью программы, которую я писал.Поскольку я расширил программу и изучил данные, BEEP , один ответ оказался проще для повторного использования: это тот, который я пометил как ответ.
Моя проблема, как оказалосьбыло мое непонимание и неспособность использовать коллекции.