#functional-programming #ocaml #currying
#функциональное программирование #ocaml #каррирование
Вопрос:
Я пытаюсь создать функцию OCaml, которая добавляет количество символов ‘a в строке к заданному аргументу.
let rec count_l_in_word (initial : int) (word : string) : int=
if String.length word = 0 then initial else
if word.[0] = 'a' then
count_l_in_word initial 1 (Str.string_after word 1)
else count_l_in_word initial (Str.string_after word 1)
В строке 4 я получаю сообщение об ошибке «Это выражение имеет тип string -> int, но здесь используется с типом int». Я не уверен, почему он ожидает, что выражение ‘count_l_in_word initial 1’ будет int . Действительно следует ожидать, что вся строка ‘count_l_in_word initial 1 (Str.string_after word 1)’ будет int .
Кто-нибудь может помочь с этим
Ответ №1:
count_l_in_word initial 1 (Str.string_after word 1)
анализируется как
(count_l_in_word initial) (1 ((Str.string_after word) 1))
итак, вам нужно добавить несколько скобок:
count_l_in_word (initial 1) (Str.string_after word 1)
Комментарии:
1. Спасибо, я думаю, я должен быть осторожен с приоритетом. Я все же заставил его работать
2. Правило IIRC заключается в том, что приложение функции имеет более высокий приоритет, чем любой оператор. Это довольно часто встречается в языках FP.
3. разве это не будет проанализировано как
(count_l_in_word initial) (1 ((Str.string_after word) 1))
?4. @newacct: вы правы. Мне не приходило в голову, что анализатор создаст функциональное приложение с
1
функцией в качестве функции 🙂