моя проблема в том, что функция должна иметь тип 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