Обратите внимание, что Core - это язык с явной типизацией, что может затруднить его генерацию на других языках (средство проверки типов GHC вывело все типы, поэтому проблем нет).Например, обычная функция идентификации (id = \x -> x :: forall a. a -> a)
становится
id = \(a :: *) (x :: a) -> a
, где a
- это переменная типа вида *
.Это заполнитель уровня термина для связывания уровня типа forall
.Точно так же, при вызове id
вам нужно дать ему тип в качестве первого аргумента, поэтому выражение Haskell (id 42)
преобразуется в (id Int 42)
.Такие привязки типов и приложения типов не будут присутствовать в сгенерированном машинном коде, но они полезны для проверки правильности преобразований компилятора.
С другой стороны, можно было бы просто сгенерировать Haskell - еслиВы можете сгенерировать код таким образом, что GHC всегда сможет определить его тип, тогда как вы по сути просто используете крошечное подмножество Haskell.Однако может ли это сработать, во многом зависит от вашего исходного языка.