Шаблон 0.0
в:
szamol <b>0.0</b> = 0.0
не имеет смысла. A Pont
Point
представляет собой 2-кортеж из Float
s, а не один Float
, поэтому вы можете определить это как:
szamol :: Pont -> Float
szamol <b>(0.0, 0.0)</b> = 0.0
szamol (x,y) = 10^(1/2)*((x^2)+(y^2))
Использование 10^(1/2)
завершится неудачей, так как Оператор ^
ожидает, что второй операнд имеет тип, который является членом класса типов Integral
. Вы можете использовать 10**(1/2)
.
Использование 10**(1/2)
даст вам квадрат root из 10
(т.е. ≈ 3.16) и не будет вычислять квадрат root от суммы квадратов.
Таким образом, вы, вероятно, захотите использовать:
szamol :: Pont -> Float
szamol (0.0, 0.0) = 0.0
szamol (x,y) = <b>sqrt (x*x + y*y)</b>
В вашей функции ossz
вы допустите три ошибки:
- тип возврата должен быть
Float
здесь; - вы суммируете с
(+)
, а не с (++)
и - , конструктор данных для списка "cons" равен
(:)
, а не (,)
:
ossz :: [Pont] -> <b>Float</b>
ossz [] = []
ossz <b>(h : t)</b> = szamol h <b>+</b> ossz t
Здесь может быть лучше использовать комбинацию sum :: (Foldable t, Num a) => t a -> a
и map :: (a -> b) -> [a] -> [b]
:
ossz :: [Pont] -> Float
ossz = <b>sum</b> . <b>map</b> szamol
РЕДАКТИРОВАТЬ : если вы хотите вернуть список Float
с, то вы можете отобразить:
ossz :: [Pont] -> [Float]
ossz = <b>map</b> szamol
или с явной рекурсией :
ossz :: [Pont] -> [Float]
ossz [] = []
ossz (h : t) = szamol h <b>:</b> ossz t