2011-07-18 7 views
2

where句を使用して楕円曲線のポイント加算を書き込もうとしています。私はコンパイラエラーを取得していますが、私は式でletを使用して同じコードを翻訳したとき、それは正常に動作します。このコードで何が間違っているか教えてください。完全なソースコード[http://hpaste.org/49174]
問題は、関数ガードの上にそのwhereブロックの範囲であるので、それは各守ら文に対して別々のwhereを作成することはできませんあなたの
ムケシュ・ティワリHaskellコードのコンパイラエラー

{-- 
--add points of elliptic curve using where clause getting compiler error 
addPoints :: Elliptic -> Point -> Point -> Either Point Integer 
addPoints _ Identity p_2 = Left p_2 
addPoints _ p_1 Identity = Left p_1 
addPoints (Conelliptic a b n) (Conpoint x_p y_p) (Conpoint x_q y_q) 
    | x_p /= x_q = case ((Conpoint x_r y_r) , d) of 
         (_ , 1) -> Left (Conpoint x_r y_r) 
         (_ , d') -> Right d' 
         where 
           [ u , v , d ] = extended_gcd (x_p - x_q) n 
           s = mod ((y_p - y_q) * u) n 
           x_r = mod (s*s - x_p - x_q) n 
           y_r = mod (-y_p - s * (x_r - x_p)) n 
    | otherwise = if mod (y_p + y_q) n == 0 then Left Identity 
        else case ((Conpoint x_r y_r) , d) of 
           (_ , 1) -> Left (Conpoint x_r y_r) 
           (_ , d') -> Right d' 
          where 
           [ u , v , d ] = extended_gcd (2 * y_p) n 
           s = mod ((3 * x_p * x_p + a) * u) n 
           x_r = mod (s * s - 2 * x_p) n 
           y_r = mod (-y_p - s * (x_r - x_p)) n 

--} 


--add points of elliptic curve let in clause and its working 
addPoints::Elliptic->Point->Point-> Either Point Integer 
addPoints _ Identity p_2 = Left p_2 
addPoints _ p_1 Identity = Left p_1 
addPoints (Conelliptic a b n) (Conpoint x_p y_p) (Conpoint x_q y_q) 
| x_p /= x_q = let 
      [ u , v , d ] = extended_gcd (x_p-x_q) n 
      s = mod ((y_p - y_q) * u) n 
      x_r = mod (s * s - x_p - x_q) n 
      y_r= mod (-y_p - s * (x_r - x_p)) n 
     in case ((Conpoint x_r y_r) , d) of 
      (_ , 1) -> Left (Conpoint x_r y_r) 
      (_ , d') -> Right d' 
| otherwise = if mod (y_p + y_q) n == 0 then Left Identity 
     else let 
       [ u , v , d ] = extended_gcd (2*y_p) n 
       s = mod ((3 * x_p * x_p + a) * u) n 
       x_r = mod (s * s - 2 * x_p) n 
       y_r = mod (-y_p - s * (x_r - x_p)) n 
      in case ((Conpoint x_r y_r) , d) of 
          (_ , 1)-> Left (Conpoint x_r y_r) 
          (_ , d') -> Right d' 

+1

コンパイラのエラーを投稿できますか?これは、あなたを手伝ってくれる人にとって非常に役に立ちます。 – fuz

+2

エラーが見つかりませんでした。両方の方法(最初と2番目)は私のマシンで問題なくコンパイルされます。 (GHC 7を使用) – fuz

+0

Elliptic_Len.hs:59:8:入力の '| ' 失敗しました。読み込まれたモジュール:なし。 ghc-6.12.1 –

答えて

9

ありがとうございます。 ghcが59行目のwhereに遭遇すると、自動的に関数宣言が終了し、新しい宣言が続くことが予想されます。これは有効な宣言ではないため、|にエラーが発生します。 letwhereは言語の異なる部分であるため、let式で動作します。 Haskell Wikiには、このトピックに関する詳細情報があります。