Questions tagged «haskell»

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

4
是否应该使用GHC Haskell扩展?
在学习Haskell的过程中,我发现现实生活中的代码中使用了许多语言扩展。作为初学者,我应该学会使用它们,还是不惜一切代价避免使用它们?我看到它破坏了与Haskell 98的兼容性并将代码限制为仅GHC。但是,如果我在Hackage上浏览软件包,则无论如何我都会看到其中大多数都是纯GHC的。 那么,社区对于使用语言扩展的态度是什么? 如果可以使用扩展名,那么如何区分可以“安全”使用的扩展名(那些可能成为下一个Haskell标准的一部分)和大多数“实验性”扩展名呢?例如,我假设-XDisambiguateRecordFields很好并且有用,但是将来可能会支持它吗?
78 haskell  ghc 

3
文字或字节串
美好的一天。 我现在讨厌Haskell的一件事是使用字符串的软件包数量众多。 首先,我使用了原生的Haskell[Char]字符串,但是当我尝试开始使用hackage库时,却在无尽的转换中完全迷失了。每个包似乎都使用不同的字符串实现,有些则采用他们自己的手工东西。 接下来,我选择了使用Data.Text字符串和OverloadedStrings扩展名重写代码,Text因为它具有更广泛的功能集,但是似乎很多项目都更喜欢ByteString。 有人可以简短地说明为什么要使用其中一个? PS:顺便说一句如何从转换Text为ByteString? 无法将预期的类型Data.ByteString.Lazy.Internal.ByteString 与推断的类型Text匹配 预期的类型:IO Data.ByteString.Lazy.Internal.ByteString推断的类型:IO文本 我试图encodeUtf8从Data.Text.Encoding,但没有运气: 无法将预期的类型 Data.ByteString.Lazy.Internal.ByteString 与推断的类型Data.ByteString.Internal.ByteString进行匹配 UPD: 感谢您的答复,*大块头的好处看起来很像,但结果令我有些震惊,我的原始功能看起来像这样: htmlToItems :: Text -> [Item] htmlToItems = getItems . parseTags . convertFuzzy Discard "CP1251" "UTF8" 现在变成: htmlToItems :: Text -> [Item] htmlToItems = getItems . parseTags . fromLazyBS . convertFuzzy Discard "CP1251" "UTF8" . …
78 string  haskell  text 

5
Monads作为附件
我一直在阅读类别理论中的单子。对monad的一个定义是使用一对伴随函子。一个单子通过使用这些函子的往返来定义。显然,附加语在范畴论中非常重要,但是我还没有看到关于伴随函子对Haskell monads的任何解释。有没有人想过?


5
Data.Text与字符串
尽管Haskell社区的普遍观点似乎是总是使用Text代替总是更好String,但是大多数可维护库的API仍然是面向的这一事实使String我感到困惑。另一方面,有一些值得注意的项目,这些项目将全部视为String错误,并且提供了Prelude-String面向功能的所有实例都替换为Text-counterparts的实例。 因此,String除了向后兼容和标准的Prelude兼容以及“切换机制”之外,人们是否有理由继续编写面向对象的API?与之Text相比,是否还有其他缺点String? 特别是,我对此很感兴趣,因为我正在设计一个库并试图决定使用哪种类型来表达错误消息。
78 string  haskell  text 

4
为什么此Haskell代码会产生“无限类型”错误?
我是Haskell的新手,并且遇到了我无法理解的“无法构造无限类型”错误。 实际上,除此之外,我什至无法找到一个很好的解释该错误的含义,因此,如果您可以超越我的基本问题并解释“无限类型”错误,我将不胜感激。 这是代码: intersperse :: a -> [[a]] -> [a] -- intersperse '*' ["foo","bar","baz","quux"] -- should produce the following: -- "foo*bar*baz*quux" -- intersperse -99 [ [1,2,3],[4,5,6],[7,8,9]] -- should produce the following: -- [1,2,3,-99,4,5,6,-99,7,8,9] intersperse _ [] = [] intersperse _ [x] = x intersperse s (x:y:xs) = x:s:y:intersperse s xs …


3
Haskell单元测试
我是Haskell的新手,正在从事单元测试,但是我发现生态系统非常混乱。我对HTF和HUnit之间的关系感到困惑。 在某些示例中,我看到您设置了测试用例,将其导出到测试列表中,然后在ghci中运行runTestsTT(如此HUnit示例)。 在其他示例中,您将创建一个绑定到cabal文件的测试运行器,该运行器使用一些预处理器魔术来查找您的测试,如git示例所示。同样,似乎需要在HTF测试前面加上前缀,test_否则它们将无法运行?我很难找到关于它的任何文档,我只是注意到每个人都有的模式。 无论如何,有人可以帮我解决这个问题吗?在Haskell中,什么是标准的做事方式?最佳做法是什么?什么是最容易设置和维护的?

8
适用于初学者的Haskell或Standard ML?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 3年前关闭。 改善这个问题 我将要教授离散结构的低年级课程。我之所以选择教科书“离散结构,逻辑和可计算性”,部分原因是它包含有助于使用功能性编程语言实现的示例和概念。(我也认为这是一本好教科书。) 我希望使用一种易于理解的FP语言来说明DS概念并供学生使用。大多数学生充其量只用Java进行一两个学期的编程。在查看了Scheme,Erlang,Haskell,Ocaml和SML之后,我选择了Haskell或Standard ML。由于以下原因,我倾向于Haskell,但我希望那些积极参与其中的程序员的意见。 Haskell和SML都具有模式匹配,这使得描述递归算法变得很困难。 Haskell具有很好的列表理解能力,与此类列表的数学表达方式非常匹配。 Haskell的评价很懒。非常适合使用列表理解技术构造无限列表。 SML具有真正的交互式解释器,可以在其中定义和使用功能。在Haskell中,必须先在单独的文件中定义函数并进行编译,然后才能在交互式shell中使用这些函数。 SML以易于理解的语法明确确认了函数参数和返回类型。例如:val foo = fn:int * int-> int。Haskell的隐式咖喱语法有点晦涩,但并非完全陌生。例如:foo :: Int-> Int-> Int。 Haskell默认情况下使用任意精度整数。它是SML / NJ中的外部库。SML / NJ默认将输出截断为70个字符。 Haskell的lambda语法很微妙-它使用单个反斜杠。SML更明确。不过,不确定是否在此类中是否需要lambda。 本质上,SML和Haskell大致等效。我倾向于Haskell,因为我喜欢Haskell中的列表理解和无限列表。但是我担心Haskell紧凑语法中的大量符号可能会引起学生问题。从我在SO上的其他文章中收集的信息来看,不建议Haskell开始使用FP。但是,我们不会尝试使用简单的算法来构建功能完善的应用程序。 你怎么看? 编辑:在阅读了您的一些好评后,我应该澄清一些要点。 在SML中,在解释器中定义函数与在外部文件中定义函数之间在语法上没有区别。假设您要编写阶乘函数。在Haskell中,您可以将此定义放入文件中并将其加载到GHCi中: fac 0 = 1 fac n = n * fac (n-1) 对我来说,这很清楚,简洁,并且与书中的数学定义相符。但是,如果要直接在GHCi中编写函数,则必须使用其他语法: let fac 0 = 1; fac …

5
Haskell Cont monad如何以及为何起作用?
这是Cont monad的定义方式: newtype Cont r a = Cont { runCont :: (a -> r) -> r } instance Monad (Cont r) where return a = Cont ($ a) m >>= k = Cont $ \c -> runCont m $ \a -> runCont (k a) c 您能解释一下它如何运作以及为什么起作用吗?到底在做什么

2
ST monad如何工作?
我知道ST monad有点像IO的小弟弟,而IO则是带有附加RealWorld魔术的状态monad 。我能想象的状态,我能想象的是现实世界被莫名其妙地投入IO,但每次我写的类型签名ST中s的ST单子让我困惑的。 例如,ST s (STArray s a b)。s那里的工作如何?它是否只是用来在计算之间建立一些人为的数据依赖性,而不能像状态monad中的状态那样引用(由于forall)? 我只是抛出一些想法,并且非常感谢比我有更多知识的人向我解释。
77 haskell  monads 

6
为什么Haskell的`head`崩溃在一个空列表上(或者为什么*不*返回一个空列表)?(语言哲学)
其他潜在贡献者的注意事项:请毫不犹豫地使用抽象或数学符号来表达您的观点。如果我不确定您的答案,我会要求您进行说明,否则请随意以一种舒适的方式表达自己。 需要明确的是:我不是在寻找“安全”对象head,也不是head特别有意义的选择。问题的重点在于对head和的讨论head',后者旨在提供上下文。 我已经和Haskell纠缠了几个月了(以至于它已经成为我的主要语言),但是我承认我对某些更高级的概念或该语言的哲学细节并不了解(尽管我非常愿意学习)。那么,我的问题不只是技术性的问题(除非是技术性问题,我只是没有意识到),因为它是一种哲学。 对于此示例,我正在谈论head。 我想像你会知道, Prelude> head [] *** Exception: Prelude.head: empty list 这来自head :: [a] -> a。很公平。显然,不能返回(挥舞着)no类型的元素。但是同时,定义起来很简单(如果不是很简单的话) head' :: [a] -> Maybe a head' [] = Nothing head' (x:xs) = Just x 我见过一些这方面的讨论很少在这里的某些语句的注释部分。值得注意的是,一位Alex Stangl说 “有充分的理由不使一切都“安全”,并在违反前提条件时抛出异常。 我不一定要质疑这个主张,但是我对这些“好的理由”是什么感到好奇。 另外,保罗·约翰逊(Paul Johnson)说, “例如,您可以定义“ safeHead :: :: [a]->可能是一个”,但是现在除了处理一个空列表或证明它不会发生之外,您必须处理“ Nothing”或证明它不会发生。” 我从那条评论中读到的语气表明,这在难度/复杂性/事物方面有明显的增加,但是我不确定我是否理解他在这里提出的内容。 一位史蒂文·普鲁兹纳(Steven Pruzina)说(在2011年不少), “有一个更深层的原因,例如'head'不能防崩溃。要实现多态但要处理一个空列表,'head'必须始终返回任何特定空列表中都没有的类型的变量。如果Haskell能够做到这一点,那就太好了……”。 通过允许空列表处理,多态性会丢失吗?如果是这样,怎么回事,为什么?是否有某些特殊情况使这一点显而易见?此部分由@Russell …

1
什么是单态性限制?
我对haskell编译器有时会推断出比我期望的少多态的类型感到困惑,例如,在使用无点定义时。 似乎问题出在“单态限制”,在较早版本的编译器上默认启用。 考虑以下haskell程序: {-# LANGUAGE MonomorphismRestriction #-} import Data.List(sortBy) plus = (+) plus' x = (+ x) sort = sortBy compare main = do print $ plus' 1.0 2.0 print $ plus 1.0 2.0 print $ sort [3, 1, 2] 如果我使用它进行编译,则ghc不会得到错误,并且可执行文件的输出为: 3.0 3.0 [1,2,3] 如果我将main主体更改为: main = do print $ …

5
Haskell类型阻碍了简单的“平均”功能
我正在与初学者Haskell玩耍,我想编写一个平均函数。好像是世界上最简单的事情,对吧? 错误。 似乎Haskell的类型系统禁止平均值在通用数字类型上工作-我可以让它在整数列表或小数列表上工作,但不能同时在两者之间工作。 我想要: average :: (Num a, Fractional b) => [a] -> b average xs = ... 但是我只能得到: averageInt :: (Integral a, Fractional b) => [a] -> b averageInt xs = fromIntegral (sum xs) / fromIntegral (length xs) 要么 averageFrac :: (Fractional a) => [a] -> a averageFrac xs …

5
良好的Haskell编码标准
有人可以提供指向Haskell良好编码标准的链接吗?我已经找到了这个和这个,但是它们远非全面。更不用说HaskellWiki包含诸如“谨慎使用类”和“定义符号中缀标识符应仅留给库作者的”这样的“宝石”。

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.