Задание изоморфизмов вручную для синонима однонаправленного шаблона

Вероятно, нет способа сделать это, но я просто хотел спросить на всякий случай.

У меня есть тип данных, это простой кортеж, как это:

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 не совсем обратные, потому что отрицательные числа не имеют реальных квадратных корней и потому, что арифметика с плавающей запятой является неточной.

Другие вопросы по тегам