我需要将编译脚本中的一些信息传递给模板Haskell。 目前编译脚本将信息保存在系统环境中,所以我只是使用包裹在runIO System.Environment.getEnvironment读取它。 有没有更好的方法,比如将一些parameter passing给ghc (类似于-D…对于C预处理器),或者可能是在TH中专门为此目的而devise的?
我遇到了Haskell的Data.Typeable引用,但是我不清楚为什么我想在我的代码中使用它。 它解决了什么问题,以及如何解决?
美好的一天。 我现在讨厌Haskell的一件事是与string一起工作的包的数量。 首先,我使用本机Haskell [Char]string,但是当我试图开始使用hackage库时,完全失去了无尽的转换。 每个包似乎都使用不同的string实现,有的采用自己手工制作的东西。 接下来,我用Data.Textstring和OverloadedStrings扩展名重写了我的代码,我select了Text因为它具有更广泛的function集,但是似乎很多项目都喜欢ByteString 。 有人可以给出简短的推理,为什么要使用一个或其他? PS:顺便说一句如何从Text转换为ByteString ? 无法匹配预期的typesData.ByteString.Lazy.Internal.ByteString针对推断的typesText Expected type:IO Data.ByteString.Lazy.Internal.ByteString推断的types:IO Text 我试图从Data.Text.Encoding ,但没有运气: 无法匹配预期的typesData.ByteString.Lazy.Internal.ByteString对于推断的typesData.ByteString.Internal.ByteString UPD: 感谢您的回应,那*大块的善良看起来像路要走,但我有点震惊的结果,我原来的function是这样的: htmlToItems :: Text -> [Item] htmlToItems = getItems . parseTags . convertFuzzy Discard "CP1251" "UTF8" 现在成了: htmlToItems :: Text -> [Item] htmlToItems = getItems . parseTags . fromLazyBS . convertFuzzy Discard "CP1251" "UTF8" . toLazyBS […]
有人可以告诉我为什么Haskell Prelude为取幂(即^和** )定义了两个单独的函数吗? 我认为types系统应该消除这种重复。 Prelude> 2^2 4 Prelude> 4**0.5 2.0
我在关于haskell和函数式编程的博客 (特别是在sigfpe的博客 )中阅读了很多关于这个术语的文章,但是我不知道它的含义。 我大部分时间都不知道,但是如果我知道的话,我可能会更好地理解这些文本。 谷歌没有帮助我。 我迷上了技术的东西。 而且,这个世界的非技术含义(“转向抽象的具体”)并不能帮助我理解它在代码中的实际意义。 我对计算机科学概念有点慢,所以用代码的实际例子会很好。 :P
是否有可能在Haskell中编写一个模块,除了导出所有可见的内容之外,它还重新导出了一个模块? 让我们考虑下面的模块: module Test where import A fx = x 这个模块导出在里面定义的所有东西,所以它导出f但不会重新导出从A导入的任何东西。 另一方面,如果我想重新导出模块A : module Test ( module A, f ) where import A fx = x 有没有办法重新导出A并导出在Test定义的所有东西 ,而不需要显式地写出Test定义的每个函数?
当我正在学习Haskell的时候,我注意到了它的types类 ,它被认为是源自Haskell的一个伟大的发明。 但是,在维基百科页面上键入class : 程序员通过指定一组函数或常量名称以及它们各自的types来定义一个types类别,这些types必须存在于属于该类别的每种types中。 这对我来说似乎与Java的界面相当接近(引用维基百科的界面(Java)页面 ): Java编程语言中的接口是一种抽象types,用于指定类必须实现的接口(在术语的通用意义上)。 这两个看起来很相似:types限制一个types的行为,而接口限制一个类的行为。 我想知道Haskell中的types和Java中的接口有什么不同和相似之处,或者它们有着根本的不同? 编辑:我注意到, 即使haskell.org承认,他们是相似的 。 如果他们如此相似(或者他们?),那么为什么types会被这样的炒作对待呢? 更多编辑:哇,这么多伟大的答案! 我想我必须让社区决定哪一个是最好的。 但是,在阅读答案的同时,他们似乎只是说“类接口可以做很多事情,而接口不能或者不得不应对generics” 。 我不禁想知道,有什么接口可以做,而typeclasses不能? 另外,我注意到维基百科声称types类最初是在1989年发表的论文“如何使临时多态不那么临时”发明的,而Haskell仍然处于摇篮中,而Java项目于1991年开始,并于1995年首次发布那么也许不是typeclass与接口类似,反过来说,接口又受typestypes的影响? 有没有文件/文件支持或反驳呢? 感谢所有的答案,他们都非常有启发性! 感谢所有的投入!
Haskell中的代数数据types (ADT)可以通过从它们派生出来自动成为一些类的实例(如Show , Eq )。 data Maybe a = Nothing | Just a deriving (Eq, Ord) 我的问题是,这是如何deriving工作,即如何Haskell知道如何实现派生types派生ADT的function? 另外,为什么只能deriving到某些特定的类? 为什么我不能写我自己的派生类可以派生?
我正在寻找一些非常简单,易于理解的recursionscheme和核心引力scheme(变形,变形,变形等)的解释,它们不需要大量的链接,也不需要打开类别理论教科书。 我确信我已经在无意识中重塑了许多这些scheme,并在编码过程中将它们“应用”在我的头脑中(我相信我们中的许多人都有),但是我不知道(共)recursionschemeI使用被称为。 (好的,我撒谎了,刚才我刚刚读到了其中的几个,这引发了这个问题,但在今天之前,我没有任何线索。 我认为这些概念在编程社区中的传播受到了可怕的解释和例子的阻碍,例如维基百科,还有其他地方。 也可能被他们的名字阻碍了。 我认为还有一些其他的math名称(有关香蕉和铁丝网的东西?),但我不知道我使用的recursionscheme的名字是什么。 我认为这将有助于使用代表简单现实世界问题的数据types的示例,而不是像二叉树这样的抽象数据types。
标准库Haskelltypes类MonadPlus , Alternative和Monoid每个都提供两种基本相同的语义: 空值: mzero , empty或mempty 。 运算符a -> a -> a将mplus中的值连接在一起: mplus , <|>或mappend 。 所有这三个都规定了这些实例应遵守的法律: mempty `mappend` x = x x `mappend` mempty = x 因此,三个types类似乎都提供了相同的方法。 ( Alternative也提供了some和many ,但是它们的默认定义通常是足够的,所以它们在这个问题上不是太重要。) 所以,我的问题是:为什么有这三个极其相似的类? 他们之间有什么真正的区别,除了他们不同的超类限制吗?