我目前正在学习 Haskell,并试图了解一个使用 Haskell 实现加密算法的项目。在在线阅读Learn You a 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 }
我能找到的所有信息源都说 @ 是 as-pattern,但这段代码显然不是那种情况。我查看了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))
我非常感谢这方面的任何帮助。