Так как f1
и f2
в вашем коде имеют одинаковый тип Run
, средство проверки типов не может различить run f1
и run f2
, которые должны иметь одинаковый тип.
Это затрудняет правильную реализацию переменных функций.
Гораздо проще использовать
data Run a = Run { run :: a }
, чтобы f1
и f2
больше не имели общий тип.
Если вас интересуют только функции Int -> ... -> Int
, могут быть некоторые решения, использующие семейства типов, GADT, DataKinds и тому подобное. Это может быть излишним, в зависимости от того, что вы пытаетесь реализовать.