Я работаю над своим заданием для функционального программирования.
Задача:
Мы вводим класс типов NewTypeClass , чтобы изменить поведение функции f путем перегрузки функции fдля различных типов.
Даны:
class (Eq a, Ord a, Show a, Num a) => NewTypeClass a where
f :: a -> a
, где f
- факториальная функция:
f n
| n == 0 = 1
| elseways = n * f (n-1)
where elseways = True
Один из типов - Int.Я должен сделать тип Int Instance класса Typeclass NewTypeClass так, чтобы, если я приведу аргумент, функция f вернула бы результат следующим образом:
f 5 ->> Error: Unresolved overloading
f ( 5 :: Int) ->> 120
f (-5 :: Int) ->> ... ->> ... Non regular termination.
Что я сделал:
instance NewTypeClass Int where
f n
| n == 0 = 1
| elseways = n * f (n-1)
where elseways = True
Мои выводы:
*Main> f 5
120
*Main> f (5::Int)
120
*Main> f (-5 :: Int)
*** Exception: stack overflow
Поскольку при вызове f 5
возвращается результат 120
, это означает, что я неправильно перегрузил функцию f
.Я что-то не правильно понял или я где-то ошибаюсь в своем коде?
Редактировать:
*Main> :set +t
*Main> f 5
120
it :: NewTypeClass a => a
*Main> f (5::Int)
120
it :: Int
*Main> f (-5 :: Int)
*** Exception: stack overflow