Как я могу заставить мою функцию возвращать double без изменения типа Metric? - PullRequest
1 голос
/ 07 ноября 2019

У меня есть функция «расстояние», которая вычисляет расстояние между двумя точками. Моя проблема заключается в том, что функция должна иметь тип Metric, тип, который возвращает Double, в то время как мой sqrt внутри функции возвращает Float. Это мой код:

    type Metric a = Point a -> Point a -> Double
    type Point a = (a, a)
    distance :: Floating a => Metric a
    distance (a1,b1) (a2, b2) = sqrt ((a*a)+(b*b))
       where a = a2 - a1
             b = b2 - b1

Я знаю, если запись Метрики как Точка a -> Точка a -> a решит мою проблему, но мне нужно использовать Метрику в том виде, в каком она была, я также искалкак конвертировать float в double в Haskell, но ничего полезного не нашел

1 Ответ

2 голосов
/ 07 ноября 2019

моя проблема в том, что функция должна иметь тип Metric, тип, который возвращает Double, в то время как my sqrt внутри функции возвращает Float.

sqrt не не возвращает Float, возвращает значение того же типа, что и параметр, и это экземпляр Floating (обратите внимание, что Floating является классом типаи не совпадает с Float, который является типом). Таким образом, он имеет тип sqrt :: Floating a => a -> a.

Здесь можно настроить свою функцию distance на distance :: Metric Double:

distance :: Metric <b>Double</b>
distance (a1,b1) (a2, b2) = sqrt ((a*a)+(b*b))
    where a = a2 - a1
          b = b2 - b1

При этом, возможно, имеет больше смысла позволить Metric вернуть a:

type Metric2 a = Point a -> Point a -> <b>a</b>

и затем, таким образом, работать с Floating a => Metric2 a:

distance :: Floating a => Metric2 a
distance (a1,b1) (a2, b2) = sqrt ((a*a)+(b*b))
    where a = a2 - a1
          b = b2 - b1
...