Подпись вашей функции getVar
неверна. Последний параметр должен быть буквой выражения, а не всего выражения. Код, вызывающий функцию getVar
, будет проходить через выражение для каждого символа, проверять, является ли оно буквой, если да, тогда вызывать getVar
, в противном случае делать другие вещи.
Причина, по которой ваш код зависает, ясно объясняется в других ответах, поэтому я не буду повторяться здесь. Но в качестве хорошей практики, пожалуйста, не используйте | _ -> ...
, если вы полностью не контролируете ситуацию. Как правило, мы должны явно писать все условия соответствия, чтобы, если мы что-то пропустили, компилятор предупредил нас. После этого, зная все условия, мы можем использовать | _ -> ...
, если это действительно означает «условие покоя s ».
Вашу функцию getVar
можно переписать так:
let rec getVar ls letter =
match ls with
| [] -> ()
| head :: tail when fst head = letter -> printfn "%d" (snd head)
| _ :: tail -> getVar tail letter
Я предлагаю вам изучить общие встроенные функции библиотеки ядра F #. Таким образом, вы можете использовать функцию List.tryFind
в вашей задаче:
let getVar ls letter =
ls |> List.tryFind (fun (key, value) ->
if key = letter then
printfn "%d" value
true
else false)
Чем больше вы можете использовать встроенных функций, тем меньше у вас ошибок.