私は現在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であると言いますが、このコードは明らかにそのケースではありません。オンラインチュートリアル、ブログ、さらにはHaskell 2010言語レポート(https://www.haskell.org/definition/haskell2010.pdf)を確認しました。この質問に対する答えはまったくありません。
この方法で@を使用して、このプロジェクトでより多くのコードスニペットを見つけることもできます。
-- | 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))
私はこれについての助けに深く感謝します。