Скажем, у меня есть функция более высокого порядка f :: (a -> b) -> (a -> b)
. Но f
ведет себя корректно, только если функция ввода сюръективна. В любом случае, чтобы это произошло в Хаскелле? Например, я действительно хочу, чтобы подпись типа f
была чем-то вроде:
f :: (Surjective (a -> b)) => (a -> b) -> (a -> b)
Но это не работает, потому что я не хочу, чтобы все функции типа a -> b
были объявлены сюръективными, только некоторые из них. Например, возможно, f
преобразует сюръективную функцию в неъективную функцию.
Мы могли бы обернуть функции в специальный тип данных data Surjective f = Surjective f
и определить
f :: Surjective (a -> b) -> (a -> b)
но это затруднит назначение нескольких свойств функции.
Есть ли удобный способ сделать это на практике? Возможно ли это в теории?