我经常听说函数式编程解决了很多程序/命令式编程困难的问题。 但是我也听说过程序编程自然很擅长的其他问题并不是很好。 在我打开我关于Haskell的书,并深入到函数式编程之前,我至less想了解一下我可以真正使用它的基本概念(本书的例子之外)。 那么,函数式编程擅长什么呢? 有什么问题不适合? 更新 到目前为止,我已经得到了一些很好的答案。 我迫不及待地想要开始学习Haskell – 我只能等到掌握了C 🙂 函数式编程的原因很多: 非常简明扼要 – 它可以用简短而不混淆的陈述来expression复杂的想法。 比命令式语言更容易validation – 在系统安全性至关重要的情况下是很好的。 函数的纯度和数据的不变性使得并发编程更加合理。 非常适合脚本和编写编译器(我希望知道为什么)。 math相关的问题简单而美观地解决。 函数式编程斗争的领域: Debatable :Web应用程序(尽pipe我猜这取决于应用程序)。 桌面应用程序(尽pipe它可能取决于语言,F#会好的这不是吗?)。 性能至关重要的任何东西,比如游戏引擎。 任何涉及大量程序状态的东西。
我正在构build一个包含两个组件的应用程序 – 用Haskell编写的服务器和用Qt(C ++)编写的客户端。 我正在用节俭的方式来沟通他们,我想知道为什么这么慢。 我做了性能testing,这是我的机器上的结果 结果 C++ server and C++ client: Sending 100 pings – 13.37 ms Transfering 1000000 size vector – 433.58 ms Recieved: 3906.25 kB Transfering 100000 items from server – 1090.19 ms Transfering 100000 items to server – 631.98 ms Haskell server and C++ client: Sending 100 pings 3959.97 ms Transfering […]
我目前正在用C ++编写一个应用程序,发现它的一些function会更好的写在Haskell中。 我看过从C代码调用Haskell的说明,但是可以用C ++做同样的事情吗? 编辑:澄清,我正在寻找的是一种方法来编译Haskell代码到外部库,g ++可以链接从C ++的对象代码。 更新:我已经为其他人感兴趣的(下面我不会忘记)举出一个工作的例子。
如何用纯粹的function语言去做双向链表呢? 那就是Haskell,你不在Monad中,所以你没有突变。 可能吗? (单链表显然很容易)。
我试图从Haskell源代码创build一个共享库。 我试过按照这里的说明: http : //weblog.haskell.cz/pivnik/building-a-shared-library-in-haskell/但我只是没有任何运气。 当我用Haskell 64位(从2011.4.0.0 ghc 7.0.4)编译我得到以下错误: ld: pointer in read-only segment not allowed in slidable image, used in ___gmpn_modexact_1c_odd 作为替代scheme,我也尝试了32位版本,并根据确切的标志,我用链接获取错误,如: Library not loaded: /usr/local/lib/ghc-7.0.4/base-4.3.1.0/libHSbase-4.3.1.0-ghc7.0.4.dylib 我确实设法通过在链接器行中添加-lHSrts来进一步实现。 这让我到成功链接和加载库的点,但我无法find函数名称使用dlsym(或手动使用nm | grep) 任何提示将不胜感激,一个例子make文件,或构build线已经成功地build立(和使用)在OS X共享库将不胜感激。 对于Haskell来说,我是个新手,不知道是否应该继续敲我的脑袋,假设问题出在我身上,或者出于各种原因,我不希望这个问题能够在OS X上运行。 我已经尝试过的所有组合的git回购可在这里: https : //github.com/bennoleslie/haskell-shared-example我做了一些工作的32位ghc,但不是64位呢。
相关types通常被广告作为一种方式,使您能够断言程序是否符合规范是正确的。 所以,例如,你被要求编写一个sorting列表的代码 – 你可以通过将“sort”的概念编码为一个types来certificate代码是正确的,并且编写一个函数,比如List a -> SortedList a 。 但是,如何certificate规范SortedList是正确的呢? 难道不是这种情况:你的规格越复杂,这个规格的types编码就越可能是不正确的?
我已经看到很多function是根据模式(f .) . g (f .) . g 。 例如: countWhere = (length .) . filter duplicate = (concat .) . replicate concatMap = (concat .) . map 这是什么意思?
在下面的代码中,我可以放在前面的最后一个短语。 它会改变什么吗? 另一个问题:如果我决定放在最后一句话前面,我需要缩进吗? 我尝试没有缩进和拥抱抱怨 do {…}中的最后一个生成器必须是一个expression式 import Data.Char groupsOf _ [] = [] groupsOf n xs = take n xs : groupsOf n ( tail xs ) problem_8 x = maximum . map product . groupsOf 5 $ x main = do t <- readFile "p8.log" let digits = map digitToInt $concat $ lines t […]
我习惯了从Haskell的懒惰评估,并发现自己现在已经使用懒惰评估正确地使用默认的急切语言激怒。 这实际上是非常有害的,因为我使用的其他语言主要是懒散地评估一些非常尴尬的东西,通常涉及到自定义迭代器等等。 所以,仅仅通过获取一些知识,我实际上使自己的原有语言的生产力下降 。 叹。 但是我听说ASTmacros提供了另一种干净的方式来做同样的事情。 我经常听到类似“懒惰的评估使得macros冗余”的说法,反之亦然,主要来自Lisp和Haskell社区的争吵。 我已经涉足了各种Lisp变体的macros。 他们看起来像是一个真正有组织的方式来复制和粘贴大量的代码,以便在编译时处理。 他们当然不是Lispers喜欢认为的圣杯。 但是,这几乎可以肯定是因为我不能正确使用它们。 当然,让macros观系统工作在相同的核心数据结构上,这种语言本身就是非常有用的,但它基本上仍然是复制和粘贴代码的有组织的方式。 我承认,将macros系统放在与允许完整运行时变更的语言相同的AST上是非常有用的。 我想知道的是,macros是如何简明扼要地做懒惰评估呢? 如果我想一行一行地处理一个文件,而不是浑浊起来,我只是返回一个列表,其中有一个线路阅读程序映射到它。 这是DWIM的完美例子(按照我的意思)。 我甚至不必考虑这个问题。 我显然不会得到macros。 我已经使用了它们,并没有特别留下深刻印象的炒作。 所以有些东西我错过了,我没有通过在线阅读文档。 有人可以向我解释这一切吗?
Haskell被称为“纯function语言”。 在这方面“纯”是什么意思? 这对程序员有什么影响?