我目前正在研究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 …
许多类型的光学元件都具有van Laarhoven表示。 例如,Lens类型的a Lens s t a b 可以表示为: Functor f => (a -> f b) -> s -> f t 类似地Traversal,可以用类似的方式表示,将Functor约束交换为Applicative: Applicative f => (a -> f b) -> s -> f t 几种光学框架(例如Monocle和Arrow)定义了一种类型Optional。 在《单片眼镜光学》中,层次结构 Optional介于Lens和之间Traversal 根据我的理解:如果Traversal是像一个Lens可能具有零到多个目标,那么Optional就像是一个Lens可能具有零到一的目标。 在Monocle中,Optional定义为一对功能: getOrModify :: s -> Either t a set :: (b, s) …
在我执行Haskell项目时stack run,它显示以下内容,但仍在运行。这是什么警告?我该如何摆脱呢? Stack has not been tested with GHC versions above 8.6, and using 8.8.2, this may fail Stack has not been tested with Cabal versions above 2.4, but version 3.0.1.0 was found, this may fail
我在Haskell图书馆的限制区中徘徊,发现了这两个卑鄙的咒语: {- System.IO.Unsafe -} unsafeDupablePerformIO :: IO a -> a unsafeDupablePerformIO (IO m) = case runRW# m of (# _, a #) -> a {- Data.ByteString.Internal -} accursedUnutterablePerformIO :: IO a -> a accursedUnutterablePerformIO (IO m) = case m realWorld# of (# _, r #) -> r 但是,实际的区别似乎只是runRW#和之间($ realWorld#)。我对他们在做什么有一些基本的想法,但是我并没有真正理解使用它们之间的真正后果。有人可以告诉我有什么区别吗?
该season函数使用代数函数,但是我觉得代码是重复的。 如何使它尽可能短? data Month = Jan | Feb | Mar | Apr | May | June | July | Aug | Sept| Oct | Nov | Dec deriving (Eq,Ord,Show,Read) data Seasons = Spring | Summer | Autumn | Winter deriving (Eq,Ord,Show,Read) season :: Month -> Seasons season Jan = Winter …
就像标题中所说的那样:对Haskell函数返回单元进行评估有什么保证?有人会认为在这种情况下无需运行任何类型的评估,()除非存在明确的严格性要求,否则编译器可以将所有此类调用替换为立即值,在这种情况下,代码可能必须决定是否应返回()或底部。 我已经在GHCi中对此进行了实验,似乎发生了相反的情况,也就是说,似乎正在评估这种功能。一个非常原始的例子是 f :: a -> () f _ = undefined f 1由于存在,评估会引发错误undefined,因此肯定会发生某些评估。但是,尚不清楚评估的深度。有时它看起来像需要评估返回函数的所有调用一样深入()。例: g :: [a] -> () g [] = () g (_:xs) = g xs 如果使用,此代码将无限循环g (let x = 1:x in x)。但是之后 f :: a -> () f _ = undefined h :: a -> () h _ …
由于State monad可分解为乘积(左-函子)和阅读器(右-可表示)。 有没有一种方法可以使Continuation Monad分解?下面的代码是我的尝试,它不会类型检查 -- To form a -> (a -> k) -> k {-# LANGUAGE MultiParamTypeClasses, TypeOperators, InstanceSigs, TypeSynonymInstances #-} type (<-:) o i = i -> o -- I Dont think we can have Functor & Representable for this type synonym class Isomorphism a b where from :: …