Функция каррирования отменяет полиморфизм в OCaml?

У меня есть функция:

 let rec loop size elem =
    if size <= 0 then []
     else elem::( loop (size - 1) elem);;

И если я наберу это в utop, я получу ожидаемый тип int -> 'a -> 'a list = <fun>, однако, если я сделаю функцию let loop_3 = loop 3, тип loop_3 станет '_a -> '_a list = <fun>. Основное отличие, касающееся меня, заключается в том, что он меняет функцию с полиморфной функции (чей вход 'a) на слабую функцию полиморфизма (тип ввода '_a). Почему это происходит? Есть ли способ обойти это?


person Boyu Fang    schedule 06.02.2015    source источник


Ответы (1)


Чтобы обойти это, вам нужно выполнить eta-expand, т.е. указать все параметры.

Вы видите результаты ограничения значения OCaml. В SO и FAQ по OCaml есть много хороших ответов на эту тему. Один из моих любимых ответов — это.

person ivg    schedule 06.02.2015