玩一些代码 : {-# LANGUAGE FlexibleInstances, OverlappingInstances #-} class Arity f where arity :: f -> Int instance Arity x where arity _ = 0 instance Arity f => Arity ((->) af) where arity f = 1 + arity (f undefined) 没有IncoherentInstances : ghci> arity foldr blah blah ambiguous blah blah possible fix blah ghci> arity […]
我意识到, OverloadedStrings语言编译指令包装所有string文字的隐含的fromString 。 我想要做的不是实际上重载string,而只是改变它们的意思,以便它们总是变成Text ,因此,使用string作为字符列表应该导致types错误。 在不导入该类的String实例的情况下,导入IsString类似乎是不可能的。 ghc是否为我提供了一些限制string文本到Text ?
ghc-pkg check会列出损坏的软件包,以及它们为什么被破坏。 但据我所知,没有自动化的方式来照顾那些破损的包裹。 什么是处理破包的build议方式? (最好不要重新安装GHC)
当通过ghc –make foo.hs编译一个haskell源文件ghc –make foo.hs GHC总是会留下除foo.exe之外的各种中间文件。 这些是foo.hi和foo.hi 我经常最终不得不删除.hi和.o文件以避免混淆文件夹。 GHC是否有命令行选项不留下中间文件? (当问到#haskell时,我得到的最佳答案是ghc –make foo.hs && rm foo.hi foo.o
我很困惑。 我尝试使用print ,但我知道人们应用putStrLn 。 他们之间真正的区别是什么? print $ function putStrLn $ function
有时候,我想要写的一段代码在没有至less一种语言扩展的情况下是不合法的。 当试图在研究论文中实现想法时尤其如此,在撰写论文的时候,研究论文倾向于使用GHC的超级扩展版本,而没有明确指出哪些扩展实际需要。 结果是,我经常在我的.hs文件的最上面得到类似这样的东西: {-# LANGUAGE TypeFamilies , MultiParamTypeClasses , FunctionalDependencies , FlexibleContexts , FlexibleInstances , UndecidableInstances , OverlappingInstances #-} 我不介意,但我常常觉得好像是为了安抚GHC的伟大的上帝而盲目牺牲。 它抱怨说,没有语言扩展X的某段代码是无效的,所以我添加了一个X的编译指示。然后它要求我启用Y,所以我为Y添加一个编译指示。到这个时候,我已经可以启用三四种我不太了解的语言扩展,我不知道哪些是“安全”的。 解释我的意思是“安全”: 我明白, UndecidableInstances是安全的,因为虽然它可能会导致编译器不终止,只要代码编译它不会有意想不到的副作用。 另一方面, OverlappingInstances显然是不安全的,因为它使我很容易意外地编写给出运行时错误的代码。 所以我的问题是: 是否有GHCextension列表被认为是“安全的”,是“不安全的”?
题 在Haskell中, base库和Hackage软件包提供了将二进制IEEE-754浮点数据转换为Float和Doubletypes浮点数据的多种方法。 但是,这些方法的准确性,性能和可移植性还不清楚。 对于旨在跨平台串行化二进制格式的GHC目标库,处理IEEE-754浮点数据的最佳方法是什么? 途径 这些是我在现有的库和在线资源中遇到的方法。 FFI封送 这是data-binary-ieee754软件包使用的方法。 由于Float , Double , Word32和Word64是Storable每个实例,因此可以将源types的值Word64外部缓冲区,然后peek目标types的值: toFloat :: (F.Storable word, F.Storable float) => word -> float toFloat word = F.unsafePerformIO $ F.alloca $ \buf -> do F.poke (F.castPtr buf) word F.peek buf 在我的机器上这工作,但我只看到分配执行,只是为了完成强制。 另外,虽然这个解决scheme并不是唯一的,但是这里有一个隐含的假设,即IEEE-754实际上是内存中的表示。 伴随包装的testing给了它“在我的机器上工作”认可的印章,但是这不是理想的。 unsafeCoerce 与内存中的IEEE-754表示相同的隐含假设,下面的代码也得到了“在我的机器上工作”的封印: toFloat :: Word32 -> Float toFloat = unsafeCoerce 这样做的好处是不像上面的方法那样进行明确的分配,但是文件中说“确保新旧types具有相同的内部表示是你的责任”。 这种隐含的假设仍然在做所有的工作,而且在处理被取消的types时更加费力。 […]
我有以下代码: main = do putStr "Test input : " content <- getLine putStrLn content 当我运行它(与runhaskell )或编译它(ghc 6.10.4)的结果是这样的: asd Test input : asd 为什么Test input : asd之后打印? 在使用putStr http://learnyouahaskell.com/上的代码示例中, getLine提供的输出与我的不同。 当我使用putStrLn程序按预期工作(打印,然后提示和打印)。 是ghc一个错误,还是它应该工作的方式?
我只是好奇Haskell中的一些确切的实现细节(GHC特定的答案是好的) – 他们是天真的链表,还是他们有任何特殊的优化? 进一步来说: 做length和(!!) (例如)必须遍历列表? 如果是这样,他们的值是以任何方式caching(即,如果我叫两次,它将不得不迭代两次)? 访问列表后面是否涉及遍历整个列表? 是无限的列表和列表理解memoized? (即,对于fib = 1:1:zipWith (+) fib (tail fib) ,每个值是recursion计算还是依赖于以前的计算值?) 任何其他有趣的实现细节将不胜感激。 提前致谢!
如您所知,模板Haskell用于在编译时以编程方式生成各种AST拼接。 然而,拼接往往是非常不透明的,而且通常难以辨别拼接实际上产生了什么。 如果你运行Q monad进行拼接,并且拼接是打好的types的,那么你就可以看到生成的AST片断,但是由于其非结构化的布局,这种表示可能很难理解。 将一段TH生成的AST转换成类似于普通Haskell代码的首选方法是什么?这样代码就可以很容易地被读取和理解了。 能从一个给定的Dec值重build源代码吗? 是否需要阅读GHC核心代码? 有没有办法来至less构build的AST,使其变得更加可读(除了什么,如pretty-show包装)?