是否可以特别使用函数的默认实现?

时间:2018-11-15 03:17:06

标签: haskell typeclass

我的代码有效。我只是想知道是否可以在使用默认实现之前先在实例声明中添加一些内容以进行检查,而不必复制代码。一个例子:

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

或者在不使用两个地方的相同代码的情况下还有其他方法吗?

解决方案是不更改默认实现!

1 个答案:

答案 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