Во-первых, как и @WillemVanOnsem, я переименую distance
в distance2
:
distance2 :: Floating a => (a, a) -> (a, a) -> a
distance2 (x1 , y1) (x2 , y2) = sqrt (x'*x' + y'*y')
where x' = x1 - x2
y' = y1 - y2
Далее, если задан список, функция разбить его на пары:
splitPairs :: [a] -> [(a,a)]
splitPairs (x:y:xs) = (x,y) : (splitPairs (y:xs))
splitPairs _ = error "can’t split into pairs when <2 elements!"
Наконец, учитывая список точек, разбейте его на пары, рассчитайте расстояние между каждой парой и сложите их:
distance :: Floating a => [(a,a)] -> a
distance = sum . map (uncurry distance2) . splitPairs