
--конкретните типове (Int,Float,Double,Bool,Char,String,...), или да включва
--ограничения за тях в зависимост кои други ф-ии използват тези аргументи.
--Ако не я напишем, интерпретаторът ще я deduce-не вместо нас, със все ограничения.

--Точна сигнатура (ще работи само с Double):
--f :: Double -> Double -> Double
--Обща, но грешна сигнатура (ще работи със всякакви типове - добре, но + и sqrt не работят със всякакви):
--f :: a -> a -> a
--Правилна сигнатура с ограничения за типа:
--f :: (Floating a) => a -> a -> a

f :: (Floating a) => a -> a -> a
f x y = sqrt (x*x + y*y)
abc :: Int
abc = 3
b :: Float
b = 4.0


--Task 1

--Функция, която приема някакво число и изписва какъв му е знака. Извиква оператора <,
--който изисква типът да е "сравним", значи и нашата функция трябва да има същото ограничение.
--Guard-овете трябва да се индентирани спрямо дефиницията на функцията (няма значение с колко)

saySign :: (Num a, Ord a) => a -> String
saySign x
  | x < 0     = "Negative"
  
f :: (Floating a) => a -> a -> a
f x y = sqrt (x*x + y*y)
f x y = sqrt (x*x + y*y)