Перегрузка функций - PullRequest
       17

Перегрузка функций

0 голосов
/ 17 ноября 2018

Я работаю над своим заданием для функционального программирования.

Задача:

Мы вводим класс типов 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

1 Ответ

0 голосов
/ 17 ноября 2018

Вызов f 5 действительно дает Uresloved Overloading ERROR в Объятиях, но в GHCi это не так. Мы можем видеть

*Main> :set +t
*Main> f 5 
120
it :: NewTypeClass a => a

вот оно действительно перегружено

...