这些天,我正在认真研究函数式编程。 虽然我对Haskell和它似乎提供的可能性感到非常兴奋,但是现在我也可以看到,这将花费我一些时间来学习。 在一个关于如何学习Haskell的SO问题上,一个答案指出,如果不是几年,实际上“掌握”它将需要几个月的时间。 现在,我知道C,PHP,一些面向对象的东西等等。有人告诉我,Haskell在“现实世界”中并没有太多的用处,那么我能更好地提高我所熟悉的常规语言的技能吗? 哈斯克尔是值得的斗争? 在这个问题上, 为什么人们认为函数式编程会抓住结论似乎是函数式编程会“赶上”。 但是程序编程肯定会保持在最前面,对吧? 编辑:keparo很好地澄清我的问题: 与程序语言相反,研究Haskell和函数式编程范例会有价值吗?
假设我有以下数据模型,用于跟踪棒球运动员,球队和教练的统计数据: data BBTeam = BBTeam { teamname :: String, manager :: Coach, players :: [BBPlayer] } deriving (Show) data Coach = Coach { coachname :: String, favcussword :: String, diet :: Diet } deriving (Show) data Diet = Diet { dietname :: String, steaks :: Integer, eggs :: Integer } deriving (Show) data BBPlayer = […]
我学习Haskell的方式我已经开始掌握monad概念,并开始使用我的代码中已知的monad,但是从devise者的angular度来看,我仍然遇到困难。 在面向对象中有几个规则,比如“为名称标识名词”,注意某种状态和接口……但是我无法为monadfind相应的资源。 那么如何将自然界中的一个问题看成一元问题呢? 一元devise有什么好的devise模式? 当你意识到某些代码可以更好地重构为monad时,你的方法是什么?
我偶然发现了函数式语言中的自由定理 。 但是,我能find的唯一资源是Wadler的文章“ 免费定理 ”。 这是相当不错的,但它绝对不是一个教程,难以让我通过(我了解了一半,它需要我花了很多时间)。 你能推荐我另外一篇文章或教程,面向熟悉function性编程的软件开发人员,而不是硬核function语言研究人员吗? 谢谢。
在函数式编程(FP)环境中使用面向对象编程(OOP)有什么优势? 我已经使用F#一段时间了,我注意到我的函数越是没有状态,我就越需要将它们作为对象的方法。 特别是,依靠types推断使它们在尽可能多的情况下可用是有利的。 这并不排除需要一些与OOP正交的forms的命名空间。 也不鼓励使用数据结构。 实际上,FP语言的实际使用在很大程度上依赖于数据结构。 如果你看看F Sharp Programming / Advanced Data Structures中实现的F#栈,你会发现它不是面向对象的。 在我看来,面向对象与处理对象状态的方法主要是为了改变对象有很大关系。 在一个纯粹的FP环境中,这是不需要也不需要的。 一个实际的原因可能是能够与OOP代码交互,就像F#与.NET一样 。 除此之外,有没有什么原因? Haskell世界的经验是什么?编程更纯粹的FP? 我会很感激任何关于这个问题的论文或反事实的例子。
例如,用Java编写的程序依赖于dynamic调度。 如何用Haskell等function语言来expression这样的程序? 换句话说,“dynamic调度”下的Haskellexpression方式是什么?
看到一个隐藏的function在C#的post,但不是很多人写了linq / lambdas的例子,所以…我不知道… C#LINQ和/或Lambdas /匿名代理你曾经看过/写过的最酷的(如最优雅的)用法是什么? 如果它已经投入生产也有奖励!
在我的代码中,我创build了一个对象的集合,这些对象将以各种线程访问,只有当对象是不可变的时候才是安全的。 当试图插入一个新的对象到我的集合,我想testing,看看它是不可变的(如果没有,我会抛出一个exception)。 我可以做的一件事是检查一些众所周知的不可变types: private static final Set<Class> knownImmutables = new HashSet<Class>(Arrays.asList( String.class, Byte.class, Short.class, Integer.class, Long.class, Float.class, Double.class, Boolean.class, BigInteger.class, BigDecimal.class )); … public static boolean isImmutable(Object o) { return knownImmutables.contains(o.getClass()); } 这实际上让我有90%的方式,但有时我的用户会想要创build自己的简单的不可变types: public class ImmutableRectangle { private final int width; private final int height; public ImmutableRectangle(int width, int height) { this.width = width; this.height […]
我经常听说函数式编程解决了很多程序/命令式编程困难的问题。 但是我也听说过程序编程自然很擅长的其他问题并不是很好。 在我打开我关于Haskell的书,并深入到函数式编程之前,我至less想了解一下我可以真正使用它的基本概念(本书的例子之外)。 那么,函数式编程擅长什么呢? 有什么问题不适合? 更新 到目前为止,我已经得到了一些很好的答案。 我迫不及待地想要开始学习Haskell – 我只能等到掌握了C 🙂 函数式编程的原因很多: 非常简明扼要 – 它可以用简短而不混淆的陈述来expression复杂的想法。 比命令式语言更容易validation – 在系统安全性至关重要的情况下是很好的。 函数的纯度和数据的不变性使得并发编程更加合理。 非常适合脚本和编写编译器(我希望知道为什么)。 math相关的问题简单而美观地解决。 函数式编程斗争的领域: Debatable :Web应用程序(尽pipe我猜这取决于应用程序)。 桌面应用程序(尽pipe它可能取决于语言,F#会好的这不是吗?)。 性能至关重要的任何东西,比如游戏引擎。 任何涉及大量程序状态的东西。
我很难理解如何在Clojure中创build一个惰性序列。 macros的文档并不完全清楚: 用法:(lazy-seq&body)获取返回ISeq或nil的expression式体,并产生一个Seqable对象,只有在第一次调用seq时才会调用主体,并caching结果并将其返回到所有后续seq电话。 我见过的所有例子似乎都是这样的: ; return everything in the sequence starting at idx n (defn myseq-after-n [n] (…) ) (def my-lazy-seq (lazy-seq (conj [init-value] (myseq-after-n 2))) ) 所以,我没有得到的第一件事是,因为lazy-seq在conj的调用之外,它如何防止conj在评估中产生一个无限序列? 我的第二个问题是,懒惰的序列定义总是采取这种一般forms?