2

where句を使用して楕円曲線の点の加算を書き込もうとしています。コンパイラエラーが発生しますが、let in式を使用して同じコードを翻訳すると、正常に動作します。このコードの何が問題なのか教えてください。完全なソースコード[ http://hpaste.org/49174]MukeshTiwari
ありがとう

{--
--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'

4

1 に答える 1

9

問題は、where関数ガードのスコープをブロックするためwhere、ガードされたステートメントごとに個別に作成することができないことです。ghcがwhere59行目に遭遇すると、関数宣言を自動的に終了し、新しい宣言が続くことを期待します。これは|、有効な宣言ではないため、エラーになります。とは言語のさまざまな部分であるためlet、let-expressionで機能します。Haskell Wikiwhereには、このトピックに関する詳細情報があります。

于 2011-07-18T20:33:31.377 に答える