Tag: 函数式编程

使用或者在Scala代码中处理失败

Option monad是一个很好的expression方式来处理Scala中的无所事事。 但是如果在“什么都没有”的情况下需要logging一条消息呢? 根据Scala API文档, 这两种types经常用作scala的替代选项。其中,Left表示失败(按惯例),Right与Some类似。 然而,我没有运气find使用Either的最佳实践,也没有好的现实世界的例子来处理失败。 最后,我为自己的项目提出了以下代码: def logs: Array[String] = { def props: Option[Map[String, Any]] = configAdmin.map{ ca => val config = ca.getConfiguration(PID, null) config.properties getOrElse immutable.Map.empty } def checkType(any: Any): Option[Array[String]] = any match { case a: Array[String] => Some(a) case _ => None } def lookup: Either[(Symbol, String), Array[String]] = for […]

混合Erlang和Haskell

如果你已经购买了函数式编程范例,那么你很可能喜欢Erlang和Haskell。 两者都具有纯粹的function核心和其他优点,如轻量级线程,使其非常适合多核世界。 但是也有一些差异。 Erlang是经过商业validation的具有成熟分布模型的容错语言。 它具有看似独特的function,能够通过热代码加载在运行时升级其版本。 (太棒了!) 另一方面,Haskell拥有任何主stream语言中最复杂的types系统。 (我把'主stream'定义为任何具有已发表的O'Reilly书籍的语言,所以哈斯克尔就是这样评价的)。它的直线单线程性能看起来比Erlang更好,轻量级线程看起来更轻。 我正试图为我剩下的编码生活组build一个开发平台,并想知道是否可以将Erlang和Haskell混合起来,以实现最佳的平台。 这个问题有两个部分: 我想使用Erlang作为一种容错MPI来将GHC运行时实例粘合在一起。 每个GHC运行时将会有一个Erlang进程。 如果“不可能发生”和GHC运行时间死了,那么Erlang进程会以某种方式检测到并死掉。 Erlang的热门代码加载和分发function将继续工作。 可以将GHC运行时configuration为仅使用一个核心,或者本地机器上的所有核心,或两者之间的任何组合。 一旦编写了Erlang库,其余的Erlang级别代码应该是纯粹的样板,并在每个应用程序的基础上自动生成。 (也许通过一个Haskell DSL例如。)如何实现至less一些这些东西? 我希望Erlang和Haskell能够共享相同的garabage收集器。 (这是比1更进一步的想法。)运行在JVM和CLR上的语言通过共享运行时间实现更大的质量。 我明白,在JVM或CLR上运行Erlang(热代码加载)和Haskell(更高版本的多态)有技术限制。 但是,解开垃圾收集器呢? (对函数式语言的运行时间的开始进行sorting)分配显然还是要非常快,所以也许这一点需要静态链接。而且应该有一些机制来区分可变堆和不可变堆(包含懒惰的一次写入内存),因为GHC需要这个。 修改HIPE和GHC是否可行,以便垃圾收集者可以共享堆? 请回答任何经验(积极或消极),想法或build议。 事实上,任何反馈(短直滥用!)是受欢迎的。 更新 感谢所有4个回复date – 每个教我至less有一个有用的东西,我不知道。 关于编码生活的其余部分 – 我把它包含在脸颊中引起争论,但实际上是这样。 我有一个项目,我打算继续努力,直到我死,它需要一个稳定的平台。 在上面提出的平台中,我只会编写Haskell,因为Erlang将自动生成。 那么Haskell会持续多久呢? Lisp依然和我们在一起,看起来好像很快就会消失。 Haskell是BSD3开放源代码,已经达到临界质量。 如果编程本身仍然是50年左右的时间,那么我认为Haskell或者Haskell的一些持续发展仍然会在这里。 更新2 回应rvirding的post 同意 – 实现一个完整的“Erskell / Haslang”通用虚拟机可能不是绝对不可能的,但是确实会非常困难。 虽然垃圾收集器级别只是像虚拟机一样共享,虽然仍然困难 ,但对我来说听起来要难一些。 在垃圾收集模型中,函数式语言必须有很多共同之处 – 不可变数据(包括thunk)的非普遍性和对非常快的分配的要求。 因此,通用性与单一虚拟机紧密捆绑的事实似乎有些奇怪。 VM有助于实现临界质量。 只要看看F#和Scala等“精简”function语言是如何起飞的。 Scala可能不具有Erlang的绝对容错能力,但是它为与JVM绑定的很多人提供了一条逃生路线。 […]

斯卡拉:“任何”和“所有”function

我的Haskell *有点生疏,所以我可以想象,我错过了显而易见的: def any[A](s: Traversable[A], f: A => Boolean): Boolean = { s.foldLeft(false)((bool, elem) => bool || f(elem)) } 这些属性之一是否适用于它? 预定义在Scala库的某处 间接的,更快的写成一些单线 错了(我没有testing,很抱歉;)) *实际上是SML,但这99%是相同的,但在阳光下没人知道。

“封闭是穷人的对象,反之亦然” – 这是什么意思?

封闭是穷人的对象,反之亦然。 我在网上的很多 地方 ( 包括SO )看过这个声明,但是我不太明白它的含义。 有人能解释一下究竟是什么意思吗? 如果可能的话,请在答案中包含例子。

在Scala中使用部分函数 – 它是如何工作的?

我是新来的Scala,我正在使用2.9.1,并且试图让我的头部如何使用部分函数。 我对咖喱函数有一个基本的了解,而且我知道,局部函数就像是二元或者其他类似的咖喱函数。 正如你可以告诉我有点在这个绿色。 似乎在某些情况下,如XML过滤,能够部分function将是非常有利的,所以我希望更好地了解如何使用它们。 我有一个使用RewriteRule结构的函数,但是我需要它使用两个参数,而RewriteRule结构只有一个,或者是一个部分函数。 我认为这是我正在考虑有帮助的情况之一。 任何build议,链接,智慧的话等欢迎! 迄今为止的答案是非常好的,已经澄清了我的一些基本误解。 我想他们也解释我在哪里挣扎 – 我想也许发布一个更具体的新问题将有所帮助,所以我也会这样做。

在C ++中的函数式编程

有人可以指导我如何在C ++的function编程? 有一些很好的在线资料可以参考吗? 请注意,我知道库FC ++。 我想知道如何单独使用C ++标准库。 谢谢。

真实世界的Haskell编程

多年来一直是命令式的开发者,我从来没有学过函数式编程的冲动。 几个月前我终于决定学习Haskell。 这是一种相当酷的语言,但我很困惑如何以这样的语言编写一个事件驱动的真正的应用程序。 你知道一个很好的教程吗? 注意:当我说“真正的应用程序”,我不是说真实的世界,生产准备的应用程序。 我只是指一个小样本应用程序,只是为了掌握它。 我认为像Windows caculator的简化版本会很好,然后可能会更复杂一些。

python列表parsing; 压缩列表的列表?

家伙。 我试图find一个问题的最优雅的解决scheme,并想知道是否有什么内置的python我试图做的。 我正在做的是这个。 我有一个列表A ,我有一个函数f ,它接受一个项目并返回一个列表。 我可以使用列表理解来转换A所有内容。 [f(a) for a in A] 但是这会返回一个列表清单; [a1,a2,a3] => [[b11,b12],[b21,b22],[b31,b32]] 我真正想要的是得到扁平化的名单; [b11,b12,b21,b22,b31,b32] 现在,其他语言有它, 传统上称为函数式编程语言中的flatmap ,而.Net将其称为SelectMany 。 python有类似的东西吗? 有没有一个整洁的方式来映射一个函数的列表,并平坦的结果? 我试图解决的实际问题是这样的; 从目录列表开始,find所有的子目录。 所以; import os dirs = ["c:\\usr", "c:\\temp"] subs = [os.listdir(d) for d in dirs] print subs currentliy给了我一个清单,但我真的想要一个清单。

什么是“n + k模式”,为什么他们从Haskell 2010被禁止?

当阅读维基百科在Haskell 2010上的条目时,我偶然发现了这一点: — using only prefix notation and n+k-patterns (no longer allowed in Haskell 2010) factorial 0 = 1 factorial (n+1) = (*) (n+1) (factorial n) “n + k模式”是什么意思? 我想这是第二行,但我不明白这可能是错的。 任何人都可以解释那里有什么问题吗? 为什么Haskell 2010中不允许使用这些n + k模式?

在Haskell中维护复杂状态

假设你正在Haskell中build立一个相当大的模拟。 有许多不同types的实体,其属性随着仿真的进行而更新。 比方说,为了举例,你的实体被称为猴子,大象,熊等。 你维护这些实体的状态的首选方法是什么? 我想到的第一个也是最明显的方法是: mainLoop :: [Monkey] -> [Elephant] -> [Bear] -> String mainLoop monkeys elephants bears = let monkeys' = updateMonkeys monkeys elephants' = updateElephants elephants bears' = updateBears bears in if shouldExit monkeys elephants bears then "Done" else mainLoop monkeys' elephants' bears' 在mainLoop函数签名中明确提到每种types的实体已经很难mainLoop 。 你可以想象,如果你有20种实体,它将会变得非常糟糕。 (对于复杂的模拟来说,20是不合理的。)所以我认为这是一个不可接受的方法。 但是它的updateMonkeys是像updateMonkeys这样的函数在它们的function上是非常明确的:它们取得一个猴子列表并返回一个新的列表。 那么接下来的想法就是把所有的状态都放到一个大数据结构中,这样就清理了mainLoop的签名: mainLoop :: GameState -> […]