我的代码有效。我只是想知道是否可以在使用默认实现之前先在实例声明中添加一些内容以进行检查,而不必复制代码。一个例子:
class (Eq a, Ord a, Show a, Num a) => Fibo a where
fib :: a -> a
fib n
| n == 0 = 0
| n == 1 = 1
| otherwise = fib (n-1) + fib (n-2)
instance Fibo Integer where
fib n
| n < 0 = -1
| n == 0 = 0
| n == 1 = 1
| otherwise = fib (n-1) + fib (n-2)
但是它也可以不用重新实现整个功能的方式编写吗?像这样:
instance Fibo Integer where
fib n
| n < 0 = -1
| otherwise = default
或者在不使用两个地方的相同代码的情况下还有其他方法吗?
解决方案是不更改默认实现!
答案 0 :(得分:5)
只需将通用代码放入帮助函数中即可:
foo::(Eq a, Ord a, Show a, Num a) =>a -> a
foo n
| n == 0 = 0
| n == 1 = 1
| otherwise = foo (n-1) + foo (n-2)
class (Eq a, Ord a, Show a, Num a) => Fibo a where
fib :: a -> a
fib = foo
instance Fibo Integer where
fib n
| n < 0 = -1
| otherwise = foo n