我目前正在研究Haskell,并尝试了解一个使用Haskell实施密码算法的项目。在在线阅读向您了解Haskell for Great Good之后,我开始理解该项目中的代码。然后我发现我陷入了下面带有“ @”符号的代码:
-- | Generate an @n@-dimensional secret key over @rq@.
genKey :: forall rq rnd n . (MonadRandom rnd, Random rq, Reflects n Int)
=> rnd (PRFKey n rq)
genKey = fmap Key $ randomMtx 1 $ value @n
在这里,randomMtx定义如下:
-- | A random matrix having a given number of rows and columns.
randomMtx :: (MonadRandom rnd, Random a) => Int -> Int -> rnd (Matrix a)
randomMtx r c = M.fromList r c <$> replicateM (r*c) getRandom
PRFKey定义如下:
-- | A PRF secret key of dimension @n@ over ring @a@.
newtype PRFKey n a = Key { key :: Matrix a }
我可以找到的所有信息源都说@是按样式排列,但是这段代码显然不是这种情况。我在https://www.haskell.org/definition/haskell2010.pdf上查看了在线教程,博客,甚至还有Haskell 2010语言报告。这个问题根本没有答案。
也可以通过这种方式使用@在此项目中找到更多代码段:
-- | Generate public parameters (\( \mathbf{A}_0 \) and \(
-- \mathbf{A}_1 \)) for @n@-dimensional secret keys over a ring @rq@
-- for gadget indicated by @gad@.
genParams :: forall gad rq rnd n .
(MonadRandom rnd, Random rq, Reflects n Int, Gadget gad rq)
=> rnd (PRFParams n gad rq)
genParams = let len = length $ gadget @gad @rq
n = value @n
in Params <$> (randomMtx n (n*len)) <*> (randomMtx n (n*len))
我对此深表感谢。