현재 Haskell을 연구하고 있으며 Haskell을 사용하여 암호화 알고리즘을 구현하는 프로젝트를 이해하려고합니다. Great Good을위한 Haskell Learn Online 을 읽은 후 해당 프로젝트의 코드를 이해하기 시작합니다. 그런 다음 "@"기호가있는 다음 코드에 붙어 있습니다.
-- | 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))
나는 이것에 대한 도움을 깊이 감사합니다.