函数重载

时间:2018-11-17 15:58:57

标签: haskell overloading typeclass

我正在为函数编程工作。

任务:

  

我们引入类型类 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。我必须使Typeclass NewTypeClass的类型为Int Instance,以便如果给定参数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 :(得分:0)

调用f 5确实会在拥抱中产生 Uresloved Overload ERROR ,但在GHCi中却不会。

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

这里确实超载了