1

这是代码(GCD 的 Euclid 算法)。当然有,Prelude.gcd但作为一个练习,我正在实施我自己的练习。

selfGCD :: Integral f => f -> f -> f  
selfGCD a b = if b == 0 then
        return a
    else 
        return (selfGCD a (mod a b))

使用ghci,我收到以下错误:

two.hs:32:25:  
Couldn't match type `f' with `m0 f'  
  `f' is a rigid type variable bound by  
      the type signature for selfGCD :: Integral f => f -> f -> f  
      at two.hs:31:1  
In the return type of a call of `return'  
In the expression: return a  
In the expression:  
  if b == 0 then return a else return (selfGCD a (mod a b))  

two.hs:34:25:  
Couldn't match type `f' with `m1 f'  
  `f' is a rigid type variable bound by  
      the type signature for selfGCD :: Integral f => f -> f -> f  
      at two.hs:31:1  
In the return type of a call of `return'  
In the expression: return (selfGCD a (mod a b))  
In the expression:  
  if b == 0 then return a else return (selfGCD a (mod a b))  

我该如何纠正这个问题?

4

2 回答 2

10

放下returns。

在 Haskell 中,return是类型的函数

return :: Monad m => a -> m a

而不是return您从命令式语言中知道的运算符。

因此,使用returns,实现具有类型

selfGCD :: (Integral a, Monad m) => a -> a -> m a

与类型签名相反。

于 2012-06-22T15:27:20.193 回答
3

首先,不要使用return. 在 Haskell 中,它不会做你认为它做的事情。其次,您再次调用 gcd 的论点被交换了。它应该是 selfGCD b (mod ab)

请参阅下面的编辑代码,该代码按 GCD 算法的预期工作。

selfGCD :: Integral f => f -> f -> f  
selfGCD a b = if b == 0 then a else selfGCD b (mod a b)
于 2012-06-22T15:33:55.877 回答