我正在为函数编程工作。
任务:
我们引入类型类 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
答案 0 :(得分:0)
调用f 5
确实会在拥抱中产生 Uresloved Overload ERROR ,但在GHCi中却不会。
*Main> :set +t
*Main> f 5
120
it :: NewTypeClass a => a
这里确实超载了