继续从下面的想法: 有没有任何可证实的现实世界的语言? 我不了解你,但是我厌倦了写我不能保证的代码。 在问上面的问题并得到一个惊人的回应(谢谢所有!)我已经决定缩小我的search一个可certificate的,实用的方法, 哈斯克尔 。 我select了Haskell是因为它确实有用(有很多为它编写的Web 框架 ,这似乎是一个很好的基准) ,我认为它在function上是足够严格的,它可能是可certificate的,或者至less允许testing不variables。 这是我想要的 (而且一直无法find) 我想要一个框架,可以看看一个Haskell函数,添加,写在psudocode: add(a, b): return a + b – 并检查某些invarients是否保留每个执行状态。 我更喜欢一些正式的证据,但我会解决像模型检查。 在这个例子中,不variables是给定值a和b ,返回值总是和a + b 。 这是一个简单的例子,但我不认为这样的框架是不可能存在的。 一个函数的复杂性肯定会有一个上限,可以被testing(一个函数的10个stringinput肯定需要很长时间!),但是这会鼓励更仔细的函数devise,并且与使用其他forms方法。 想象一下,使用Z或B,当你定义variables/设置时,你要确保你给variables尽可能小的范围。 如果你的INT永远不会超过100,那么确保你初始化它! 像这样的技术和适当的问题分解应该 – 我认为 – 允许对像Haskell这样的纯函数语言进行满意的检查。 我还没有很正式的方法或Haskell经验。 让我知道,如果我的想法是一个健全的,或者你认为哈斯克尔不适合? 如果您build议使用不同的语言,请确保它通过“has-a-web-framework”testing,并阅读原始问题 🙂
我想压缩以下列表清单: >>> zip([[1,2], [3,4], [5,6]]) [[1,3,5], [2,4,6]] 只有当列表被拆分成单独的组件时,才能通过当前的zip实现来实现: >>> zip([1,2], [3,4], [5,6]) (1, 3, 5), (2, 4, 6)] 无法弄清楚如何拆分列表并将各个元素传递给zip 。 function性解决scheme是首选。
我一直在阅读许多文章,试图理解function和逻辑编程之间的区别,但迄今为止唯一能够做出的演绎是逻辑编程通过mathexpression式来定义程序。 但是这样的事情与逻辑编程没有关系。 我真的很感激function和逻辑编程之间的区别。
Don Syme在他的SPLASH演讲中表示,F#不是为了替代C#,即使它具有一般的function。 他继续说,有些地方F#在使用上没有意义,但没有扩大论文。 有人可以告诉我什么地方应该避免使用F#? 你也可以提到C#闪耀的领域。 相关问题: 在哪些地方使用F#比C#更合适?
在Java中有没有一个好的函数式编程库? 我正在寻找像Predicate和List.Find() (作为一个静态方法)的东西。 实现起来并不复杂,但是在这里find一个可重用的库是很好的。
考虑一个单链表。 它看起来像 data List x = Node x (List x) | End 定义折叠函数是很自然的 reduce :: (x -> y -> y) -> y -> List x -> y 从某种意义上说, reduce f x0用reduce f x0代替每个Node用reduce f x0代替每个Node 。 这是前奏曲所指的折叠 。 现在考虑一个简单的二叉树: data Tree x = Leaf x | Branch (Tree x) (Tree x) 定义一个函数,如 reduce :: (y […]
我最近开始学习scala,并且遇到了:: :(cons)函数,这个函数前面是一个列表。 在“Scala编程”一书中,它指出不存在追加函数,因为追加到列表的性能为o(n),而预先计算的性能为o(1) 有些事情让我觉得这个说法是错误的。 性能是否依赖于实现? 是不是可以简单地实现与前进和后退链接的列表,并将第一个和最后一个元素存储在容器中? 我想第二个问题是当我有一个列表时,我应该做什么,说1,2,3,我想添加4到最后?
我总是对学习新的语言感兴趣,这个事实让我感到脚踏实地,让我(我相信)成为一个更好的程序员。 我试图征服Haskell来来去去 – 曾经两次 – 我决定是时候再试一次。 第三次的魅力吧? 不。 我重读了我的旧笔记,并感到失望:-( 上次让我失去信心的问题很简单:整数的排列。 即从整数列表到列表列表 – 它们的排列列表: [int] -> [[int]] 这实际上是一个通用的问题,所以用'a'取代'int'仍然适用。 从我的笔记: 我自己编码,我成功了。 欢呼! 我把我的解决scheme发给我的一个好朋友 – 哈斯克尔大师,通常有助于向大师学习 – 他告诉我,这是我所知道的,“expression了语言的真正力量,使用通用设施来编码需要”。 所有这一切,我最近喝了这个苦工,走吧: permute :: [a] -> [[a]] permute = foldr (concatMap.ins) [[]] where ins x [] = [[x]] ins x (y:ys) = (x:y:ys):[ y:res | res <- ins x ys] 嗯。 […]
我正在介绍函数式编程[FP](使用Scala)。 从我最初的学习中得出的一件事是FPs很大程度上依赖于recursion。 而且在纯 FP中,似乎只是通过编写recursion函数来完成迭代。 而且由于recursion的使用量很大,FPs不得不担心StackoverflowExceptions通常是由于长时间recursion调用。 通过引入一些优化来解决这个问题(在维护堆栈框中进行与尾部recursion相关的优化以及从Scala v2.8开始的@tailrec批注) 有人可以请启发为什么recursion对函数式编程范例如此重要吗? 函数式编程语言的规范中是否存在某些东西,如果我们迭代地执行某些东西,会被“违反”? 如果是的话,我也很想知道这一点。 PS:请注意,我是function性编程的新手,所以请随时指出我现有的资源,如果他们解释/回答我的问题。 我也明白,斯卡拉特别是提供了支持做迭代的东西。
你什么时候不想使用函数式编程? 有什么不好? 我更加关注整体范式的弊端,而不是“不被广泛使用”或“没有好的可用debugging器”之类的东西。 现在这些答案可能是正确的,但是他们处理FP是一个新概念(一个不可避免的问题),而不是任何固有的特性。 有关: 函数式编程的优点 为什么没有function性编程呢?