Проблема с типом выражения OCaml

#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 функцией в качестве функции 🙂