Mik*_*and 10 haskell functional-programming
我正在寻找使用Haskell或F#学习函数式编程.
是否有任何编程习惯(好的或坏的)可能形成Haskell的懒惰评估?为了理解函数式编程,我喜欢Haskell函数式编程纯度的概念.我只是有点担心两件事:
谢谢,
麦克风
Sim*_*low 21
当用懒惰的语言编程时,你会遇到一些习惯,这些习惯不能用严格的语言编写.其中一些对于Haskell程序员来说似乎很自然,他们并不认为它们是懒惰的评估.我脑子里有几个例子:
f x y = if x > y then .. a .. b .. else c
  where
    a = expensive
    b = expensive 
    c = expensive
这里我们在一个where子句中定义了一堆子表达式,完全忽略了它们中的哪一个将被评估.无关紧要:编译器将确保在运行时不执行不必要的工作.非严格语义意味着编译器能够执行此操作.每当我用严格的语言写作时,我都会绊倒这个.
想到的另一个例子是"编号":
pairs = zip xs [1..]
这里我们只想将列表中的每个元素与其索引相关联,并且使用无限列表进行压缩[1..]是在Haskell中执行此操作的自然方式.如果没有无限的名单,你怎么写?好吧,折叠不太可读
pairs = foldr (\x xs -> \n -> (x,n) : xs (n+1)) (const []) xs 1
或者你可以用明确的递归来编写它(太冗长,不融合).还有其他几种方法可以编写它,其中没有一种方法像它一样简单明了zip.
我相信还有更多.当你习惯它时,懒惰是非常有用的.
Don*_*art 11
你肯定会了解评估策略.对于特定类型的编程问题,非严格的评估策略可能非常强大,一旦您接触到它们,您可能会因为在某些语言环境中无法使用它们而感到沮丧.
我可能会开发在懒惰世界中工作的思维模式,但不能在正常的顺序/热切的评估世界中工作.
对.你将成为一个更加圆润的程序员.提供"延迟"机制的抽象现在相当普遍,所以你不是一个不了解它们的程序员.
- 我可能会将基于惰性评估的功能误解为"功能范例"的一部分.
懒惰评估是功能范例的重要组成部分.这不是一个要求 - 您可以通过热切的评估进行功能编程 - 但它是一个自然适合函数式编程的工具.
您可以看到人们在不使其成为默认语言的语言中显式实现/调用它(特别是以延迟序列的形式); 虽然将其与命令式代码混合在一起需要谨慎,但纯粹的功能代码可以安全地使用惰性.由于懒惰使许多结构更清洁,更自然,所以非常合适!
(免责声明:没有Haskell或F#体验)
| 归档时间: | 
 | 
| 查看次数: | 1086 次 | 
| 最近记录: |