Задание изоморфизмов вручную для синонима однонаправленного шаблона
Вероятно, нет способа сделать это, но я просто хотел спросить на всякий случай.
У меня есть тип данных, это простой кортеж, как это:
data Tup a = T a a
У меня есть синоним шаблона как это:
pattern (:?) :: () => Floating a => a -> a -> Tup a
pattern (x :? y) <- T x (sqrt->y)
Это соответствует на T x y
, но дает у квадратный корень. так:
let (_ :? y) = T 1 4 in y
является
2.0
Я также хотел бы иметь возможность использовать :?
как конструктор, так что я бы мог делать классные вещи, такие как:
1 :? 2
оценивая
T 1.0 4.0
Конечно, мне пришлось бы вручную указывать изоморфизм, но есть ли какая-либо синтаксическая или языковая функция, которая позволила бы мне получить такое поведение?
1 ответ
Начиная с GHC 7.10, вы можете использовать
pattern (:?) :: () => Floating a => a -> a -> Tup a
pattern (x :? y) <- T x (sqrt->y) where
x :? y = T x (y^2)
Моя главная проблема заключается в том, что sqrt
а также ^2
не совсем обратные, потому что отрицательные числа не имеют реальных квадратных корней и потому, что арифметика с плавающей запятой является неточной.