从编程生涯的第一天开始,我开始使用面向对象的编程.但是,我有兴趣学习其他范例(我在这里说了很多次这是一件好事,但我没有时间去做).我想我不仅准备好了,而且还有时间,所以我将开始用F#进行函数式编程.
但是,我不确定如何构建更少的设计应用程序.我已经习惯了OO编程中的每类文件和类名词/函数动词.您如何设计和构建功能性应用程序?
我正在尝试编写一个JavaScript函数,它将返回其第一个参数(函数),其所有其余参数作为该函数的预设参数.
所以:
function out(a, b) {
document.write(a + " " + b);
}
function setter(...) {...}
setter(out, "hello")("world");
setter(out, "hello", "world")();
会两次输出"你好世界".对于setter的一些实现
我在第一次尝试时遇到了操纵arguments数组的问题,但似乎有更好的方法来做到这一点.
折叠上有什么好的教程?
原始问题,从删除中恢复以提供其他答案的上下文:
我正在尝试实现一种方法来查找矩形,圆形,位置和所有扩展形状的组的boudning框.组基本上是一组形状
abstract class Shape
case class Rectangle(width: Int, height: Int) extends Shape
case class Location(x: Int, y: Int, shape: Shape) extends Shape
case class Circle(radius: Int) extends Shape
case class Group(shape: Shape*) extends Shape
Run Code Online (Sandbox Code Playgroud)
我得到了除第一组之外的所有三个计算的边界框.所以现在对于边界框方法我知道我应该使用map并向左折叠为Group,但我无法找到创建它的确切语法.
object BoundingBox {
def boundingBox(s: Shape): Location = s match {
case Circle(c)=>
new Location(-c,-c,s)
case Rectangle(_, _) =>
new Location(0, 0, s)
case Location(x, y, shape) => {
val b = boundingBox(shape)
Location(x + b.x, y + b.y, b.shape)
}
case Group(shapes …Run Code Online (Sandbox Code Playgroud) 给定以下用于在Scala中定义函数的构造,您能解释一下它们之间的区别,以及它们的含义是什么?
def foo = {}
Run Code Online (Sandbox Code Playgroud)
与
def foo() = {}
Run Code Online (Sandbox Code Playgroud)
更新
感谢您的快速回复.这些都很棒.对我来说唯一的问题是:
如果我省略括号,是否还有办法传递函数?这是我在repl中得到的:
scala> def foo = {}
foo: Unit
scala> def baz() = {}
baz: ()Unit
scala> def test(arg: () => Unit) = { arg }
test: (arg: () => Unit)() => Unit
scala> test(foo)
<console>:10: error: type mismatch;
found : Unit
required: () => Unit
test(foo)
^
scala> test(baz)
res1: () => Unit = <function0>
Run Code Online (Sandbox Code Playgroud)
更新2012-09-14
以下是我注意到的一些类似问题:
jvm programming-languages functional-programming scala jvm-languages
如果你已经购买了函数式编程范例,那么你很可能同时喜欢Erlang和Haskell.两者都具有纯粹的功能核心和其他优点,如轻量级线程,使其非常适合多核世界.但也存在一些差异.
Erlang是一种商业上经过验证的容错语言,具有成熟的分发模型.它具有看似独特的功能,能够通过热代码加载在运行时升级其版本.(太酷了!)
另一方面,Haskell拥有任何主流语言中最复杂的类型系统.(我将'主流'定义为任何已发布的O'Reilly书籍的语言,因此Haskell很重要.)它的直线单线程性能看起来优于Erlang,其轻量级线程看起来更轻.
我正在尝试为我的编码生涯中的其余部分组建一个开发平台,并且想知道是否有可能将Erlang和Haskell混合以实现最佳的平台.这个问题有两个部分:
请回答任何经验(积极或消极),想法或建议.事实上,任何反馈(没有直接滥用!)都是受欢迎的.
更新
感谢迄今为止的所有4个回复 - 每个回复教我至少一个我不知道的有用的东西.
关于其余的编码生活事物 - 我把它略微舌头放在脸颊上引发争论,但实际上是真的.我有一个项目,我打算继续工作直到我死,它需要一个稳定的平台.
在我上面提到的平台中,我只会编写Haskell,因为将自动生成样板Erlang.那么Haskell会持续多久?好吧Lisp仍然和我们在一起,看起来不会很快消失.Haskell是BSD3的开源软件,已达到临界质量.如果编程本身在50年左右仍然存在,我预计Haskell或者Haskell的一些不断演变仍将存在.
更新2 以回应rvirding的帖子
同意 - 实现一个完整的"Erskell/Haslang"通用虚拟机可能并非绝对不可能,但确实非常困难.尽管如此,将垃圾收集器级别作为VM之类的东西共享虽然仍然很难,但听起来要小一些.在垃圾收集模型中,函数式语言必须有许多共同点 - 不可变数据(包括thunk)的无处不在和非常快速分配的要求.因此,将通用性与单片VM紧密捆绑在一起这一事实似乎有些奇怪.
虚拟机确实有助于达到临界质量.看看像F#和Scala这样的"精简"功能语言是如何起飞的.Scala可能没有Erlang的绝对容错能力,但它为许多与JVM绑定的人提供了一条逃生路线.
虽然拥有单个堆会使消息传递速度非常快,但它会引入许多其他问题,主要是因为它必须是交互式且全局不中断的,因此GC变得更加困难,因此您无法使用相同的简单算法.进程堆模型.
当然,这对我来说非常有意义.GHC开发团队中非常聪明的人似乎试图通过平行的"停止世界"GC来解决部分问题.
http://research.microsoft.com/en-us/um/people/simonpj/papers/parallel-gc/par-gc-ismm08.pdf
(显然,"停止世界"不会因为它的主要用例而对一般的Erlang飞行.)但即使在"停止世界"的用例中也是如此,它们的加速似乎并不普遍.所以我同意你的观点,不太可能有一个普遍最好的GC,这就是我在我的问题第1部分中指出的原因.
GHC运行时可以配置为仅使用一个核心,或本地计算机上的所有核心,或其间的任何组合.
通过这种方式,对于给定的用例,我可以在基准测试后选择使用Erlang方式,并运行一个GHC运行时(使用单线程GC)和每个核心一个Erlang进程,让Erlang在内核之间复制内存以获得良好的局部性.
或者,在处理器上具有4个核心/处理器且具有良好内存带宽的双处理器计算机上,基准测试可能表明我运行一个GHC运行时(使用并行GC)以及每个处理器一个Erlang进程.
在这两种情况下,如果Erlang和GHC可以共享一个堆,那么共享可能会被绑定到以某种方式在单个核上运行的单个OS线程.(我在这里深入了解,这就是我提出这个问题的原因.)
我还有另一个议程 - 独立于GC的功能语言基准测试.我经常读到OCaml v GHC v Erlang v ...的基准测试结果,并想知道不同的GC会对结果造成多大的影响.如果选择GC可以与功能语言的选择正交怎么办?GC究竟有多昂贵?看到这个恶魔倡导者的博文
http://john.freml.in/garbage-collection-harmful
由我的Lisp朋友约翰弗雷姆林,他迷人地,给他的帖子标题"自动垃圾收集是垃圾".当John声称GC很慢并且没有真正加速那么多时,我希望能够用一些数字来对抗.
erlang garbage-collection haskell functional-programming ghc
我有一个关于哪种样式是首选的问题:std :: bind Vs lambda在C++ 0x中.我知道它们服务于某些不同的目的,但我们举一个交叉功能的例子.
使用lambda:
uniform_int<> distribution(1, 6);
mt19937 engine;
// lambda style
auto dice = [&]() { return distribution(engine); };
Run Code Online (Sandbox Code Playgroud)
使用bind:
uniform_int<> distribution(1, 6);
mt19937 engine;
// bind style
auto dice = bind(distribution, engine);
Run Code Online (Sandbox Code Playgroud)
我们应该选择哪一个?为什么?假设与上述示例相比情况更复杂.即一个优于另一个的优点/缺点是什么?
有人可以指导我如何在C++中进行函数式编程吗?我可以参考哪些好的在线资料?
请注意,我知道库FC++.我想知道如何单独使用C++标准库.
谢谢.
我意识到这可能被认为是一个主观或可能是一个非主题的问题,所以我希望它不会被关闭,而是会被迁移,也许是程序员.
我开始学习Haskell,主要是为了我自己的教化,我喜欢支持语言的很多想法和原则.在参加了我们玩Lisp的语言理论课之后,我对函数式语言着迷了,而且我听说过很多关于Haskell有多高效的好东西,所以我想我会自己调查一下.到目前为止,我喜欢这种语言,除了一件我无法摆脱的事情:那些母亲正在起作用的功能签名.
我的专业背景主要是做OO,特别是在Java中.我工作过的大多数地方都在许多标准的现代教条中受到重创; 敏捷,清洁代码,TDD等.经过几年的工作,它一定成为我的舒适区; 尤其是"好"代码应该是自我记录的想法.我已经习惯了在IDE中工作,其中具有非常描述性签名的冗长和详细的方法名称对于智能自动完成和用于导航包和符号的大量分析工具来说不是问题; 如果我可以在Eclipse中按Ctrl + Space,那么从查看其名称和与其参数关联的本地范围变量而不是拉起JavaDocs推断出方法正在做什么,我和大便中的猪一样高兴.
这显然不是Haskell社区最佳实践的一部分.我已经阅读了很多关于此事的不同意见,我理解Haskell社区认为其简洁性是"专业人士".我已经阅读了如何阅读Haskell,我理解了很多决策背后的理由,但这并不意味着我喜欢它们; 一个字母的变量名称等对我来说并不好玩.我承认,如果我想继续使用该语言,我将不得不习惯这一点.
但我无法克服功能签名.以这个例子为例,从学习Haskell [...]关于函数语法的部分开始:
bmiTell :: (RealFloat a) => a -> a -> String
bmiTell weight height
| weight / height ^ 2 <= 18.5 = "You're underweight, you emo, you!"
| weight / height ^ 2 <= 25.0 = "You're supposedly normal. Pffft, I bet you're ugly!"
| weight / height ^ 2 <= 30.0 = "You're fat! Lose some weight, fatty!"
| otherwise = …Run Code Online (Sandbox Code Playgroud) 我只是开始熟悉种类的概念,所以如果我没有好好地提出我的问题,请耐心等待...
值有类型:
3 :: Int
[1,2,3] :: [Int]
('c',True) :: (Char,Bool)
Run Code Online (Sandbox Code Playgroud)
类型有种类:
the type 'Int' has kind *
the type '[Int]' also has kind *
but the type constructor [] has kind * -> *
similarly, the type (Char,Bool) has kind *
but the type constructor (,) has kind * -> * -> *
Run Code Online (Sandbox Code Playgroud)
Kinds有什么?
他们种类有类型,种类,品种或品种吗?
这个抽象序列到底有多远?我们是否会停止,因为我们没有语言,或者我们是否因为更远没有价值而停止?或者,或许,因为我们很快就达到了人类认知的极限,而且无法将我们的头脑包裹在更高级别的种类中?
一个相关的问题:语言为我们提供了值构造函数(如cons运算符)来创建值.语言还为我们提供了类型构造函数,如(,)或[]来创建类型.是否有任何语言可以使用类型构造函数来制作类型?
另一个我很好奇的边缘情况:我们显然有一种没有价值的类型,表示为⊥,称为"底部类型".有没有类型的东西:底层的?
我今天正在查看我的代码库并发现了这个:
def optionsToArgs(options, separator='='):
kvs = [
(
"%(option)s%(separator)s%(value)s" %
{'option' : str(k), 'separator' : separator, 'value' : str(v)}
) for k, v in options.items()
]
return list(
reversed(
list(
(lambda l, t:
(lambda f:
(f((yield x)) for x in l)
)(lambda _: t)
)(kvs, '-o')
)
)
)
Run Code Online (Sandbox Code Playgroud)
它似乎采用参数的dict并将它们转换为shell命令的参数列表.它看起来像是在生成器理解中使用yield,我认为这是不可能的......?
>>> optionsToArgs({"x":1,"y":2,"z":3})
['-o', 'z=3', '-o', 'x=1', '-o', 'y=2']
Run Code Online (Sandbox Code Playgroud)
它是如何工作的?