除了模式,@在Haskell中还意味着什么?

问题描述 投票:13回答:1

我目前正在研究Haskell,并尝试了解一个使用Haskell实施密码算法的项目。在在线阅读了《 [学习Haskell带来的伟大成就]》之后,我开始理解该项目中的代码。然后我发现我陷入了以下代码,并带有“ @”符号:-- | 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))

我对此深表谢意,感谢。

我目前正在研究Haskell,并尝试了解一个使用Haskell实施密码算法的项目。在在线阅读“学到了Haskell的伟大成就”之后,我开始理解...

haskell symbols operator-keyword as-pattern
1个回答
15
投票
@n是现代Haskell的高级功能,通常LYAH之类的教程都没有涵盖,也无法在报告中找到。

它称为type application,是GHC语言扩展。要理解它,请考虑这个简单的多态函数

© www.soinside.com 2019 - 2024. All rights reserved.