Да, это ожидаемое поведение.Компилятор не пытается понять содержимое блоков raw
, что делает их довольно опасными для использования в целом.Если есть синтаксическая ошибка, компилятор не будет жаловаться.
Алгоритм вывода типа всегда будет пытаться вывести наиболее общий тип, который без каких-либо подсказок в противном случае будет ... чем угодно.Он даже не предполагает, что это функция, поскольку это не обязательно.
%raw
- это выражение, которое можно аннотировать типом, как любое другое выражение.Магия происходит внутри, а не снаружи.Вы можете либо дать выражению тип напрямую:
let f = ([%raw {|
function() {
return 4;
}
|}] : unit -> int)
, либо связать, как вы делаете с x
:
let f : unit -> int = [%raw {|
function() {
return 4;
}
|}]