Questions tagged «haskell»

Haskell是一种功能性编程语言,具有强大的静态类型,惰性评估,广泛的并行性和并发支持以及独特的抽象功能。


1
除了模式外,@在Haskell中还有什么意思?
我目前正在研究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 …

1
Haskell解析器是否应该允许数字文字使用Unicode数字?
作为练习,我将从头开始为Haskell编写解析器。在编写词法分析器时,我注意到Haskell 2010报告中的以下规则: 数 → ascDigit | uniDigit ascDigit → 0| 1| …| 9 uniDigit →任意Unicode十进制数字 octit → 0| 1| …| 7 hexit → 数字 | A| …| F| a| …|f 十进制 → 位 { 位数 } 八进制 → octit { octit } 十六进制 → hexit { hexit } 整数 → …

1
van Laarhoven是否表示“可选”
许多类型的光学元件都具有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) …

2
堆栈尚未通过GHC和Cabal版本的测试
在我执行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


3
用于表示具有0到5个值的列表的类型
我有一个练习,我必须定义一个类型来表示具有0到5个值的列表。首先,我认为我可以像这样递归解决此问题: data List a = Nil | Content a (List a) 但是我认为这不是正确的方法。你能给我个思路吗?
13 haskell 

3
折叠后无需后处理步骤,是否可以实现此文字功能?
《真实世界》 Haskell,印刷版的第98页第4章询问是否words可以使用折叠实现,这也是我的问题: 可能吗?如果没有,为什么?如果是,怎么办? 我基于以下想法提出了以下想法:每个非空格都应该放在输出列表中的最后一个单词之前(这发生在otherwise防护中),并且空格应该触发将空值单词附加到输出列表,如果没有一个已经(这是在处理if- - )。thenelse myWords :: String -> [String] myWords = foldr step [[]] where step x yss@(y:ys) | x == ' ' = if y == "" then yss else "":yss | otherwise = (x:y):ys 显然,此解决方案是错误的,因为输入字符串中的前导空格会导致输出字符串列表中的一个前导空字符串。 在上面的链接中,我研究了为其他读者准备的几种解决方案,其中许多解决方案与我的解决方案相似,但是它们通常对折页的输出进行“后处理”,例如通过折叠tail处理是一个空的前导字符串。 其他方法使用元组(实际上仅是成对的),以便对折处理成对的并可以很好地处理前导/尾随空间。 在所有这些方法中,foldr(或另一种折衷方式)并不是开箱即用地提供最终输出的功能。总有其他东西必须以某种方式调整输出。 因此,我回到最初的问题,询问是否实际上可以words使用折叠实现(以某种方式正确处理尾随/前导/重复的空格)。通过使用折叠,我的意思是折叠功能必须是最外面的功能: myWords :: String -> [String] myWords input …

1
unsafeDupablePerformIO和accursedUnutterablePerformIO有什么区别?
我在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#)。我对他们在做什么有一些基本的想法,但是我并没有真正理解使用它们之间的真正后果。有人可以告诉我有什么区别吗?

3
(-)貌似有两种不同的类型?
在ghci中,当我输入 :t (-) 找出类型(-),它返回 (-) :: Num a => a -> a -> a 但是,当我写-1haskell返回一个数字时,这似乎暗示它(-)是type Num a => a -> a。(-)看起来怎么会有两种不同的类型?
12 haskell 

3
如何使Haskell函数尽可能短?
该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 …

2
结合Haskell代码片段以获得更大的画面
这是我在某处遇到的代码,但想知道它是如何工作的: findIndices :: (a -> Bool) -> [a] -> [Int] findIndices _ [] = [] findIndices pred xs = map fst (filter (pred . snd) (zip [0..] xs)) 输出:findIndices(== 0)[1,2,0,3,0] == [2,4],其中pred是(== 0)&xs是[1,2,0,3,0] 我将展示一些理解: (zip [0..] xs) 上一行所做的是将索引放入列表中的所有内容。对于上面给出的输入,它看起来像这样:[(0,1),(1,2,2,(2,0),(3,3),(4,0)] (pred . snd) 我发现这意味着像pred(snd(x))。我的问题是,列表是否由邮编组成?我倾向于是,但是我的猜测很脆弱。 接下来,是我对fst和snd的理解。我知道 fst(1,2) = 1 和 snd(1,2) = 2 …

1
Haskell中(^)的怪异行为
为什么GHCi在下面给出错误的答案? GHCi λ> ((-20.24373193905347)^12)^2 - ((-20.24373193905347)^24) 4.503599627370496e15 Python3 >>> ((-20.24373193905347)**12)**2 - ((-20.24373193905347)**24) 0.0 更新 我将实现Haskell的(^)函数,如下所示。 powerXY :: Double -> Int -> Double powerXY x 0 = 1 powerXY x y | y < 0 = powerXY (1/x) (-y) | otherwise = let z = powerXY x (y `div` 2) in …

1
在Haskell中评估函数->()有什么规则?
就像标题中所说的那样:对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 _ …

1
如何将连续单声道分解为左右伴随?
由于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 :: …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.