Questions tagged «haskell»

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

1
haskell中的attoparsec或parsec
我必须解析一些文件,并将它们转换为一些预定义的数据类型。 Haskell似乎为此提供了两个软件包: 阿托帕塞 差距 两者之间有什么区别,哪一个更适合根据某些规则解析文本文件?

4
如何在解释模式下运行Haskell文件
有人告诉我您可以解释Haskell文件(我认为这意味着它们将像Ruby / Python / Perl一样工作)。但是,我找不到GHC上的命令行选项。它总是想编译我的文件。也看了GHCi,但它总是使我陷入混乱。 我基本上只是想做ghc -i MyFile.hs(其中-i是我假装与解释模式相关的虚假标志)并执行它,以便在尝试想法和学习时可以快速获得反馈。

4
将字符串转换为Haskell中的整数/浮点数?
data GroceryItem = CartItem ItemName Price Quantity | StockItem ItemName Price Quantity makeGroceryItem :: String -> Float -> Int -> GroceryItem makeGroceryItem name price quantity = CartItem name price quantity I want to create a `GroceryItem` when using a `String` or `[String]` createGroceryItem :: [String] -> GroceryItem createGroceryItem (a:b:c) = …

7
foldl是尾递归的,那么foldr如何比foldl运行得更快?
我想测试foldl vs foldr。从我所看到的情况来看,由于尾部递归优化,您应该在可能的情况下使用foldl over foldr。 这很有道理。但是,运行此测试后,我感到困惑: 文件夹(使用时间命令时需要0.057s): a::a -> [a] -> [a] a x = ([x] ++ ) main = putStrLn(show ( sum (foldr a [] [0.. 100000]))) foldl(使用time命令时需要0.089s): b::[b] -> b -> [b] b xs = ( ++ xs). (\y->[y]) main = putStrLn(show ( sum (foldl b [] [0.. …

14
Haskell中2个列表的笛卡尔积
我希望在Haskell中产生2个列表的笛卡尔积,但是我不知道该怎么做。笛卡尔积提供列表元素的所有组合: xs = [1,2,3] ys = [4,5,6] cartProd :: [a] -> [b] -> [(a,b)] cartProd xs ys ==> [(1,4),(1,5),(1,6),(2,4),(2,5),(2,6),(3,4),(3,5),(3,6)] 这不是一个实际的家庭作业问题,并且与任何此类问题都没有关系,但是解决这个问题的方法可能会帮助我坚持下去。

10
文件夹如何工作?
谁能解释foldr工作原理? 请看以下示例: Prelude> foldr (-) 54 [10, 11] 53 Prelude> foldr (\x y -> (x+y)/2) 54 [12, 4, 10, 6] 12.0 我对这些处决感到困惑。有什么建议?



11
Haskell函数是否可以通过正确性属性进行证明/模型检查/验证?
继续以下思想:是否存在可证明的现实世界语言? 我不认识你,但是我讨厌写我不能保证的代码。 在问完上述问题并得到了惊人的答复之后(谢谢!),我决定缩小对Haskell的可证明的,务实的方法的搜索范围。我选择Haskell是因为它实际上很有用(为此编写了许多 Web 框架,这似乎是一个不错的基准),而且我认为它在功能上非常严格,可能可以证明,或者至少允许测试不变式。 这就是我想要的(一直找不到) 我想要一个框架,可以查看以psudocode编写的Haskell函数: add(a, b): return a + b -并检查某些不变式是否保持在每个执行状态。我希望有一些正式的证明,但是我会选择模型检查器之类的东西。 在此示例中,不变的是给定值a和b,返回值始终是a + b之和。 这是一个简单的示例,但我认为这样的框架不可能存在。可以测试的函数的复杂度肯定会有一个上限(一个函数的10个字符串输入肯定会花费很长时间!),但这会鼓励更仔细地设计函数,与使用其他形式函数没什么不同方法。想象一下使用Z或B,当您定义变量/集时,您一定要确保为变量提供尽可能小的范围。如果您的INT永远不会超过100,请确保将其初始化!我认为,像这样的技术以及适当的问题分解应该能够令人满意地检查像Haskell这样的纯功能语言。 我对形式方法或Haskell还不是很有经验。让我知道我的想法是否合理,或者您认为haskell不适合?如果您建议使用其他语言,请确保其通过“具有网络框架”测试,并阅读原始问题:-)

7
惰性评估和时间复杂度
我一直在研究stackoverflow非临时性惰性评估,这使我想到了Keegan McAllister的演讲:为什么要学习Haskell。在幻灯片8中,他显示了最小功能,定义为: minimum = head . sort 并指出其复杂度为O(n)。我不明白,如果按替换排序为O(nlog n),为什么说复杂度是线性的。帖子中提到的排序不能是线性的,因为它不假设任何有关数据的信息,这是线性排序方法(例如计数排序)所要求的。 懒惰的评估在这里扮演着神秘的角色吗?如果是这样,其背后的解释是什么?

5
在无限列表上左右折叠
我对“了解您的Haskell”(很棒的书imo,不要轻描淡写)中的以下文章有疑问: 一个很大的不同是,右折叠在无限列表上起作用,而左折叠则不行!简而言之,如果您在某个时间点取一个无限的列表,然后将其从右侧折叠起来,最终您将到达列表的开头。但是,如果您在某个点取一个无限的列表,然后尝试将其从左向上折叠,那么您将永远无法结束! 我就是不明白这一点。如果您获取一个无限列表,然后尝试从右侧将其折叠起来,那么您将不得不从无穷大的那一点开始,这只是没有发生(如果有人知道您可以使用的语言,请告诉:p )。至少,您必须根据Haskell的实现从那里开始,因为在Haskell foldr和foldl中,不需要使用确定在列表中应该从何处开始折叠的参数。 我同意报价单iff foldr和foldl的参数确定了它们应该在列表中的何处开始折叠,因为有意义的是,如果您从无限的列表开始并从已定义的索引开始折叠,它将最终终止,而实际上不管你从左折开始 您将向无限折叠。但是,foldr和foldl不接受此参数,因此引号没有意义。在Haskell中,无限列表上的左折和右折都不会终止。 我的理解正确吗?还是我缺少什么?

1
使用TemplateHaskell列出名称空间中的所有名称
我想要一个TemplateHaskell函数variablesInScope :: Q [Name],该函数返回Name范围中所有变量的列表。TemplateHaskell显然具有可用的信息,以实现诸如reify :: Name -> Q Info和的功能lookupValueName :: String -> Q (Maybe Name)。 我想要的功能是否存在于某个地方而我只是忽略了它?还是可以通过某种方式轻松构建?


6
究竟Haskell中的()是什么?
我正在阅读Learn Has a Haskell,在monad章节中,对我来说,()每种类型都将其视为一种“空值”。当我检查()GHCi的类型时,我得到 >> :t () () :: () 这是一个非常令人困惑的声明。看来这()本身就是一种类型。我对它如何适合该语言以及它似乎能够代表任何类型感到困惑。

5
如何创建多变量haskell函数?
我需要一个函数,该函数接受任意数量的参数(所有类型相同),对它们执行某些操作,然后返回结果。在我的具体情况下,参数列表是不可行的。 当我浏览haskell库时,我看到该函数printf(来自module Text.Printf)使用了类似的技巧。不幸的是,通过查看源代码我无法理解这种魔力。 有人可以解释如何实现这一目标,或者至少可以解释一些网页/论文/无论我能在哪里找到合适的描述吗? 动机: 我需要这个的原因确实很简单。对于学校(计算机科学班),我们需要编写一个模块,该模块能够“记录”数学表达式,将其表示为字符串(通过为自己的数据类型编写Num / Real / etc实例),然后执行各种操作就可以了。 此数据类型包含变量的特殊构造函数,可以用值或指定函数替换任何值。目标之一就是编写一个函数,该函数采用带有一些变量(成对的type (Char,Rational))的表达式,并计算表达式的结果。我们应该看看如何最好地表达功能的目标。(我的想法:该函数返回另一个函数,该函数接受与该函数中定义的var一样多的参数-似乎是不可能的)。

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.