递归函数:文字不产生实例(数字)

时间:2019-06-24 16:13:35

标签: haskell

我正在尝试创建一个递归函数,该函数根据减法定义除法。因此,我创建了一个新类型“ DividedResult”,以考虑“除以零”的情况。我的数据类型声明和函数类型声明有意义吗?我收到这样的错误:

Could not deduce (Num DividedResult) arising from a use of `+'
data DividedResult = Result Integer | DividedByZero

dividedBy :: Integer -> Integer -> (DividedResult, Integer)
dividedBy num denom = go num denom 0
  where go n d count
         | d == 0 = (DividedByZero, n)
         | abs n < abs d = (count, n)
         | abs n >= abs d && n > 0 && d > 0 = go (n - d) d (count + 1)
         | abs n >= abs d && n > 0 && d < 0 = go (n + d) d (count - 1)
         | abs n >= abs d && n < 0 && d < 0 = go (n - d) d (count + 1)
         | abs n >= abs d && n < 0 && d > 0 = go (n + d) d (count - 1)

(可能必须创建一个Num实例?我试过了,但是对我来说不起作用)。 这是我的代码:

{{1}}

1 个答案:

答案 0 :(得分:4)

出现该错误的原因是因为您试图在此处返回实际的Integer:

| abs n < abs d = (count, n)

通过返回count(而不是IntegerDividedResult,编译器认为您正在尝试将数字强制转换为DividedResult,只有在{ {1}}是DividedResult

在这种情况下,将Num设为DividedResult的实例将是过大的;您只需要包装Num

count
相关问题