我喜欢在我的舒适区之外学习语言,但是我很难find一个function语言的地方。 我听说“计算机程序结构与解释”有很多好的东西,但是几年前,当我试图通读这些东西的时候,它似乎在脑海中闪过。 我用书比网站做的更好,但是当我访问当地的书店时,LISP上的书看起来有点吓人。 那么什么是一个好的起点呢? 我的目标是能够在6个月左右的时间内使用函数式编程语言来解决简单的问题,并能够转向更高级的主题,识别何时使用function语言是正确的工具,并使用该语言在2 – 3年的时间内解决更多的问题。 我喜欢书中的例子,但也包括工作的挑战。 function语言是否存在这样的事情?
作为面向对象的开发者,也许我很难看到它的价值。 他们给了什么附加值? 他们适合在面向对象的世界吗?
是否有任何为Scala编写的库,可以实现function反应式编程?
Jamie Zawinski在他(1997)的文章“java sucks”中使用了这个术语,就好像你应该知道这意味着什么: 我真的很讨厌缺乏向下的东西, 匿名课是一个蹩脚的替代品。 (我可以没有长寿的closures生活,但我觉得缺乏function指针是巨大的痛苦。) 这似乎是Lisper的俚语,我可以在这里find以下简短的定义,但不知何故,我想我仍然不明白: 许多closures只在绑定的范围内使用; 这些被称为Lisp说法中的“向下的乐趣”。 如果不是因为史蒂夫·叶格 ,我现在只是觉得自己很愚蠢,但是看起来好像可以问一下: 杰米·扎文斯基是英雄。 一个活的传奇 […] 一个人可以使用“向下funargs”一词,然后瞪着你只是敢于让他解释它,你克雷廷。 – XEmacs死了,XEmacs万岁 那么有没有一个Lisper可以为我这样的C程序员编译?
我正在考虑在某个时候创build一个function反应框架。 我已经阅读了很多,并看到了一些例子,但是我想清楚地知道这个框架将被视为一个FRP扩展/ dsl。 我并不是真的关心实现问题或具体情况等,而更关心的是在完美的世界中需要什么。 一个理想的function反应式编程语言的关键操作和质量是什么?
Haskell中的id函数有哪些用途?
这个周末我决定尝试一下Scala和Clojure。 我精通面向对象的编程,所以Scala很容易被用作语言,但是想要尝试函数式编程。 这是困难的地方。 我似乎无法将自己的头脑变成一种写作function的模式。 作为一个专业的function程序员,你如何解决一个问题? 给定一个值列表和一个确定的求和时间段,你将如何生成一个新的列表中的简单移动平均值? 例如:给定列表values (2.0,4.0,7.0,6.0,3.0,8.0,12.0,9.0,4.0,1.0)和period 4,函数应返回:(0.0,0.0,0.0,4.75,5.0, 6.0,7.25,8.0,8.25,6.5) 花了一天的时间仔细研究之后,我可以在Scala中得到最好的结果是: def simpleMovingAverage(values: List[Double], period: Int): List[Double] = { (for (i <- 1 to values.length) yield if (i < period) 0.00 else values.slice(i – period, i).reduceLeft(_ + _) / period).toList } 我知道这是非常低效的,我宁愿做一些事情: where n < period: ma(n) = 0 where n = period: ma(n) = […]
如果我有一个像List[Option[A]] ,我想把它转换成List[A] ,标准的方法是使用flatMap : scala> val l = List(Some("Hello"), None, Some("World")) l: List[Option[java.lang.String]] = List(Some(Hello), None, Some(World)) scala> l.flatMap( o => o) res0: List[java.lang.String] = List(Hello, World) 现在o => o只是一个身份函数。 我本来以为会有办法做的: l.flatMap(Identity) //return a List[String] 但是,我无法得到这个工作,因为你不能生成一个object 。 我尝试了一些东西没有用。 有没有人有这样的工作?
我知道Monad可以在Scala中表示如下: trait Monad[F[_]] { def flatMap[A, B](f: A => F[B]): F[A] => F[B] } 我明白为什么它是有用的。 例如,给出两个function: getUserById(userId: Int): Option[User] = … getPhone(user: User): Option[Phone] = … 我可以很容易地写函数getPhoneByUserId(userId: Int)因为Option是一个monad: def getPhoneByUserId(userId: Int): Option[Phone] = getUserById(userId).flatMap(user => getPhone(user)) … 现在我在Scala中看到Applicative Functor : trait Applicative[F[_]] { def apply[A, B](f: F[A => B]): F[A] => F[B] } 我不知道什么时候该用它来代替 monad。 […]
我遇到了Richard Stallman的以下陈述 : '当你启动一个Lisp系统时,它会进入一个read-eval-print循环。 大多数其他语言没有什么比较可读的,没有任何可比的eval,没有什么可比的印刷品。 什么缺陷的缺陷! “ 现在,我在Lisp中做了很less的编程,但是我在Python中编写了大量的代码,最近在Erlang中编写了一些代码。 我的印象是,这些语言也提供了read-eval-print循环,但Stallman不同意(至less关于Python): 人们告诉我这跟Python有着根本的相似之处,我剔除了Python的文档。 我的结论是,事实并非如此。 当你启动Lisp时,它会“读取”,“评估”和“打印”,所有这些在Python中都是缺失的。 Lisp和Python的read-eval-print循环之间有真正的技术差异吗? 你能举出一些Lisp REPL很容易实现的例子吗?