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'
コンパイラのエラーを投稿できますか?これは、あなたを手伝ってくれる人にとって非常に役に立ちます。 – fuz
エラーが見つかりませんでした。両方の方法(最初と2番目)は私のマシンで問題なくコンパイルされます。 (GHC 7を使用) – fuz
Elliptic_Len.hs:59:8:入力の '| ' 失敗しました。読み込まれたモジュール:なし。 ghc-6.12.1 –