haskell - Haskell 代码中的编译器错误

标签 haskell elliptic-curve

我正在尝试使用 where 子句编写椭圆曲线点加法。我收到编译器错误,但是当我使用 let in expression 翻译相同的代码时,它工作正常。有人可以告诉我这段代码有什么问题吗?完整源代码[http://hpaste.org/49174 ]
谢谢
穆克什·蒂瓦里

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

最佳答案

问题在于 where 阻止了函数保护的作用域,因此不可能为每个 protected 语句创建单独的 where。当 ghc 在第 59 行遇到 where 时,它会自动结束函数声明并期望后面有一个新的声明,这使得 | 成为错误,因为它不是有效的声明。它与 let 表达式一起使用,因为 letwhere 是语言的不同部分。 Haskell Wiki有关于此主题的更多信息。

关于haskell - Haskell 代码中的编译器错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6738030/

相关文章:

haskell - 使用重载字符串

algorithm - 使用 Strauss-Shamir 方法进行 EC 标量乘法

java - 进行椭圆曲线加密时出现无效 key 异常

java - 在 Bouncy CaSTLe 中将字节编码的 key 转回其原始 ECPublicKey

haskell - Haskell 中的重载(show 和 num)

haskell - 解决狮子、狼和山羊的问题

MySQL 与 Windows 上的 Haskell

haskell - 为什么是 WrappedMonad 和 WrappedArrow?

javascript - 如何格式化 OpenSSL key 以匹配在线示例 (JSBN-ECC)

python - 尝试在 ECC 上添加两个点,但第三个点始终不在曲线上