"scala"包有许多名为Product,Product1,Product2等的类,直到Product22.
这些类的描述肯定是准确的.例如:
Product4 is a cartesian product of 4 components
Run Code Online (Sandbox Code Playgroud)
准确,是的.交际?没那么多.我希望这对于已经理解在这里使用的"笛卡儿产品"感的人来说是完美的措辞.对于没有的人来说,这听起来有点循环."哦,是的,还有当然产品4是喃喃的4个产品咕哝,喃喃自语."
请帮助我理解正确的功能语言观点.这里使用的"笛卡尔积"是什么意思?产品类的"投影"成员表示什么?
因为那里有非图灵完整的语言,并且鉴于我没有在大学学习Comp Sci,有人可以解释一下Turing-incomplete语言(如Coq)不能做的事情吗?
或者是没有实际利益的完整性/不完整性(即它在实践中没有太大的区别)?
编辑 - 我正在寻找一个答案,你不能用非Turing完整语言构建一个哈希表,因为X或类似的东西!
programming-languages functional-programming turing-complete coq
从一个选项列表到一个只包含Some的元素的列表,我出乎意料地遇到了一些麻烦.
我最初的尝试是:
let ga = List.filter (fun xx ->
match xx with
| Some(g) -> true
| None -> false) gao
Run Code Online (Sandbox Code Playgroud)
但是,当然,这种结果类型仍然是一个选项列表.我不知道如何使用List.map来压缩它,因为你必须处理匹配语句中的所有情况.我有一个丑陋的解决方案,但我想知道是否有更好的东西.
丑陋:
let rec gOptRemove gdec gacc =
match gdec with
| head :: tail ->
match head with
| Some(a) -> gOptRemove tail (a :: gacc)
| None -> gOptRemove tail gacc
| [] -> gacc
Run Code Online (Sandbox Code Playgroud)
我更愿意找到一个非递归的解决方案或找出这种事情的标准方法.
我的Haskell*有点生疏,所以我可以想象我错过了显而易见的事情:
def any[A](s: Traversable[A], f: A => Boolean): Boolean = {
s.foldLeft(false)((bool, elem) => bool || f(elem))
}
Run Code Online (Sandbox Code Playgroud)
这些属性中的一个是否适用于它?
*实际上是SML,但这是99%相同,但在阳光下没有人知道.
我将介绍函数式编程[FP](使用Scala).从我最初的学习中得出的一点是,FP很大程度上依赖于递归.而且似乎在纯 FP中,执行迭代的唯一方法是编写递归函数.
由于递归的大量使用似乎FPs不得不担心的下一件事StackoverflowExceptions通常是由于长缠绕递归调用.通过引入一些优化(@tailrec从Scala v2.8开始维护堆栈帧和注释中的尾递归相关优化)来解决这个问题
有人可以请教我为什么递归对函数式编程范式如此重要?如果我们迭代地执行某些操作,那么函数式编程语言的规范中是否会出现"违反"的内容?如果是,那么我也很想知道这一点.
PS:请注意,我是函数式编程的新手,所以如果他们解释/回答我的问题,请随时向我指出现有资源.另外我也明白Scala特别为迭代的东西提供支持.
我正在寻找功能编程概念.
我已经使用Javascript多年来在Web应用程序中进行客户端脚本编写,除了使用原型之外,还有简单的DOM操作,输入验证等.
最近,我经常读到 Javascript是支持函数式编程的语言之一.
凭借我对Javascript的熟悉和经验,我倾向于使用它来学习函数式编程.我希望我能够更专注于主要的功能概念,而不是被一种全新的语法所困扰或分散注意力.
总而言之,Javascript是学习函数式编程概念的不错选择吗?Javascript中哪些功能相关/支持函数式编程?
当函数式程序员说某个东西可以组合或不可组合时,他们的意思是什么?
我读过的一些这类陈述是:
我遇到Richard Stallman的以下声明:
'当你启动一个Lisp系统时,它会进入一个read-eval-print循环.大多数其他语言没有什么可比阅读,没有什么可比得上eval,没有什么比得上印刷.有什么差距不足!"
现在,我在Lisp中做了很少的编程,但我在Python中编写了大量代码,最近在Erlang中编写了一些代码.我的印象是这些语言也提供了read-eval-print循环,但Stallman不同意(至少关于Python):
"在人们告诉我它与Lisp基本相似之后,我浏览了Python的文档.我的结论是,情况并非如此.当你启动Lisp时,它会"读取","eval"和"print",所有这些都在Python中缺失.
Lisp和Python的read-eval-print循环之间真的存在根本的技术差异吗?你能举例说明Lisp REPL易于使用并且在Python中很难做到的事情吗?
在阅读维基百科在Haskell 2010上的条目时,我偶然发现了这一点:
-- using only prefix notation and n+k-patterns (no longer allowed in Haskell 2010)
factorial 0 = 1
factorial (n+1) = (*) (n+1) (factorial n)
Run Code Online (Sandbox Code Playgroud)
"n + k模式"是什么意思?我想这是第二行,但我不知道它可能有什么问题.任何人都可以解释那里的问题是什么?为什么Haskell 2010中不允许使用这些n + k模式?