我对fix的文档有点困惑(尽pipe我想我明白它现在应该做什么),所以我查看了源代码。 这让我更加困惑: fix :: (a -> a) -> a fix f = let x = fx in x 这究竟是如何返回一个固定的点? 我决定尝试在命令行: Prelude Data.Function> fix id … 它挂在那里。 现在公平地说,这是我的旧的macbook,这是慢的。 然而,这个函数的计算花费不算太高,因为任何传递给id的东西都会返回相同的结果(更不要说它没有CPU时间了)。 我究竟做错了什么?
我是斯蒂芬·沃尔夫勒姆(Stephen Wolfram)的忠实粉丝,但是他绝对不会害羞。 在许多参考文献中,他将Mathematica作为一种不同的符号编程范例来颂扬。 我不是Mathematica用户。 我的问题是:这是什么符号编程? 它和function语言(如Haskell)相比如何?
我一直在F#开发一段时间,我喜欢它。 但是我知道F#中不存在的一个stream行词是高级types。 我已经阅读了更高版本的材料,我想我理解他们的定义。 我只是不知道为什么他们有用。 有人可以提供一些在Scala或Haskell中更高级的types变得容易的例子,需要F#中的解决方法吗? 同样对于这些例子,如果没有更高版本的types(或者F#中的反过来),变通方法是什么? 也许我只是习惯于解决这个问题,我没有注意到这个function的缺失。 (我想)我得到的,而不是myList |> List.map f或myList |> Seq.map f |> Seq.toList更高kindedtypes允许您只需编写myList |> map f ,它会返回一个List 。 这很好(假设它是正确的),但似乎有点小气? (并不能简单地通过允许函数重载?)我通常转换为Seq ,然后我可以转换为任何我想要的事情。 再次,也许我太习惯于解决它了。 但是有没有什么例子可以让更高级的types真正的节省你的击键和types安全?
当使用-Wall选项编译我的Haskell应用程序时,GHC会抱怨孤立的实例,例如: Publisher.hs:45:9: Warning: orphan instance: instance ToSElem Result typesToSElem不是我的,它是由HStringTemplate定义的。 现在我知道如何解决这个问题(将实例声明移动到声明了Result的模块中),我知道为什么GHC宁愿避免孤立的实例 ,但我仍然相信我的方式更好。 我不在乎编译器是否不方便 – 而不是我。 我想在Publisher模块中声明我的ToSElem实例的原因是因为它是依赖于HStringTemplate的发布者模块,而不是其他模块。 我试图保持关注的分离,并避免每个模块都依赖于HStringTemplate。 我认为Haskell的types类的一个优点,比如与Java的接口相比,它们是开放的而不是封闭的,因此实例不必与数据types在同一个地方声明。 GHC的build议似乎是忽略这一点。 所以,我所要找的是要么证实我的思想是正确的,要么忽略/压制这个警告是合理的,要么是一个更有说服力的论点来反对我的做法。
我想知道是否有某种方法可以使Haskell在JVM上运行(编译或解释)? 在Sourceforge上有JHaskell,但是这个似乎是空的和死的。 GHC使用LLVM作为编译器后端。 将LLVM编译成Java字节码是个好主意还是可能的? 或者也许使用不同的编译器后端?
当我学习Haskell时,我发现在现实生活中有很多语言扩展的代码。 作为初学者,我应该学会使用它们,还是应该不惜一切代价避免它们? 我发现它打破了与Haskell 98的兼容性,并将代码限制在几乎GHC。 但是,如果我在Hackage上浏览软件包,我发现其中大部分都只是GHC。 那么,社区对使用语言扩展的态度是什么呢? 如果扩展的使用是好的,那么我怎样才能从那些大部分是“实验性的”中区分出可以“安全地”使用的扩展(可能成为下一个哈斯克尔标准的一部分)? 例如,我想-XDisambiguateRecordFields是好的和有用的,但它是否有可能在未来的支持?
我一直在想这个问题很长,但真的无法find答案在谷歌以及在Stackoverflow类似的问题。 如果有重复,我很抱歉。 很多人似乎都认为用OCaml和Haskell等函数式语言编写编译器和其他语言工具要用命令式语言编写它们会更加高效和容易。 这是真的? 如果是这样的话 – 为什么使用函数式语言而不是像C这样的命令式语言来编写它们是如此高效和容易呢? 另外 – function语言中的语言工具是否比C语言中的低级语言要慢?
我正在48小时内写作自己的计划 (我约85小时),我已经到了关于添加variables和作业的部分。 本章有一个很大的概念上的跳跃,我希望这个过程是分两步完成的,在这之间有一个很好的重构,而不是直接跳到最后的解决scheme。 无论如何… 我已经迷失了许多不同的课程,这些课程似乎有相同的目的: State , ST , IORef和MVar 。 正文中提到了前三个,而最后一个似乎是前三个StackOverflow问题的答案。 它们似乎都在连续调用之间进行状态。 这些都是什么,它们又有什么不同呢? 特别是这些句子没有意义: 相反,我们使用称为状态线程的function,让Haskell为我们pipe理聚合状态。 这让我们可以像处理任何其他编程语言一样使用函数来获取或设置variables。 和 IORef模块允许您使用IO monad内的有状态variables。 所有这些使得行type ENV = IORef [(String, IORef LispVal)]混淆 – 为什么第二个IORef ? 如果我写入type ENV = State [(String, LispVal)]会怎样呢?
Happstack Lite打破了我,因为它得到了火焰HTML版本0.5,它想要版本0.4。 Cabal说安装了0.4.3.4和0.5.0.0 两个版本。 我想删除0.5.0.0,只使用旧版本。 但cabal没有“卸载”命令,当我尝试ghc-pkg unregister –force blaze-html , ghc-pkg说我的命令已被忽略。 我该怎么办? 更新 : 不要相信它 。 虽然ghc-pkg声称忽略命令,但命令不会被忽略。 随着唐·斯图尔特的接受答案,你可以删除你想要消除的版本。
我不确定是什么原因导致了这个问题,但是在一个项目中,我正在编译,编译器花了几个小时才编译一个模块。 我的代码库的总大小是352KB,但是没有一个模块超过10KB。 我正在使用一个本地端口,但它是非常微不足道的; 我只是Date.now() 。 有没有什么会令榆树编译器永久编译的知名度? 我没有很多的依赖,但我使用Html很多。 我真的很感激任何暗示,什么会导致这一点。 编辑 所以原来大的expression式会导致优化器花费很长时间,从0.16开始。 这里是关于榆树讨论提出这个问题的讨论 ,以及这个讨厌的案例匹配的主旨 。 我认为是冗长的,为了保持胡萝卜的外观,为什么榆木的编译器会采用这种方式进行大小写匹配? 底层机器在这里发生了什么? 为什么编译器花费超过一个小时的时间来优化案例陈述上的60多个模式匹配?