我正在尝试创建一个递归函数,该函数根据减法定义除法。因此,我创建了一个新类型“ 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}}
答案 0 :(得分:4)
出现该错误的原因是因为您试图在此处返回实际的Integer:
| abs n < abs d = (count, n)
通过返回count
(而不是Integer
,DividedResult
,编译器认为您正在尝试将数字强制转换为DividedResult
,只有在{ {1}}是DividedResult
在这种情况下,将Num
设为DividedResult
的实例将是过大的;您只需要包装Num
:
count