1

これがコードです (GCD のユークリッドのアルゴリズム)。もちろんあります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

s をドロップしreturnます。

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 に答える