我对这是什么有一个粗略的想法,但如果有人对"表达问题"的解释他们认为简洁直观我很乐意听到它.
computer-science programming-languages functional-programming
像我之前的许多愚蠢的先驱一样,我正在努力穿越理解Monads的无轨荒地.
我仍然蹒跚而行,但我不禁注意到Python的with声明具有某种类似monad的质量.考虑这个片段:
with open(input_filename, 'r') as f:
for line in f:
process(line)
Run Code Online (Sandbox Code Playgroud)
将open()调用视为"单元",将块本身视为"绑定".实际的monad没有暴露(呃,除非f是monad),但模式就在那里.不是吗?或者我只是误将所有FP误认为是monadry?或者它只是凌晨3点,似乎有什么可信的?
一个相关的问题:如果我们有monad,我们是否需要例外?
在上面的片段中,I/O中的任何故障都可以从代码中隐藏.磁盘损坏,缺少指定文件和空文件都可以被视为相同.因此不需要可见的IO异常.
当然,Scala的Option类型类已经消除了可怕的Null Pointer Exception.如果你重新考虑作为Monads的数字(有NaN和DivideByZero作为特殊情况)......
就像我说的,早上3点.
我看到Scala社区中有很多人建议避免像"瘟疫一样"进行分类.使用子类型的各种原因是什么?有哪些替代方案?
我已经习惯了命令式编程,这是告诉计算机逐步执行程序以获得最终结果的常用方法.另一方面,声明性编程只是传递输入并期望输出而不说明过程如何完成.我很困惑的是功能编程.我知道函数式编程是一种编程范式,它将计算视为数学函数的评估,避免使用状态和可变数据,而不是一种声明性语言.但是,我仍然不能理解它是如何工作的.
我们举一个执行Fibonacci数的例子.
命令式编程:
#include<stdio.h>
#include<conio.h>
main()
{
int n,i,c,a=0,b=1;
printf("Enter Fibonacci series of nth term : ");
scanf("%d",&n);
printf("%d %d ",a,b);
for(i=0;i<=(n-3);i++)
{
c=a+b;
a=b;
b=c;
}
printf("%d ",c);
getch();
}
Run Code Online (Sandbox Code Playgroud)
声明性编程:
Give the nth number and it will return the value of the nth number
Run Code Online (Sandbox Code Playgroud)
功能计划如何运作?
如果我的定义错了,请纠正我.请随意发表评论..
我正在学习斯卡拉,作为一名优秀的学生,我试图遵守我发现的所有规则.
一条规则是:不可靠性!
所以我试图使用不可变数据结构和val来编写所有代码,有时候这很难.
但今天我想到了自己:唯一重要的是对象/类应该没有可变状态.我不是被迫以不可变的样式编写所有方法,因为这些方法不会相互影响.
我的问题:我是否正确或有任何问题/缺点我看不到?
编辑:
aishwarya的代码示例:
def logLikelihood(seq: Iterator[T]): Double = {
val sequence = seq.toList
val stateSequence = (0 to order).toList.padTo(sequence.length,order)
val seqPos = sequence.zipWithIndex
def probOfSymbAtPos(symb: T, pos: Int) : Double = {
val state = states(stateSequence(pos))
M.log(state( seqPos.map( _._1 ).slice(0, pos).takeRight(order), symb))
}
val probs = seqPos.map( i => probOfSymbAtPos(i._1,i._2) )
probs.sum
}
Run Code Online (Sandbox Code Playgroud)
说明:这是一种计算变量阶齐次马尔可夫模型的对数似然的方法.state的apply方法获取所有先前的符号和即将到来的符号,并返回这样做的概率.
正如您所看到的:整个方法只是增加了一些使用变量更容易的概率.
我正在查看一些代码,并看到了关于"滞后"的脱离背景评论.我想我已经弄明白代码的作用,所以我的问题不涉及任何具体的问题.我根本不明白这个术语的含义或它在编程中的适用方式.我环顾四周,看到了一些数学定义,但想了解更多信息.据我所知,Hysteresis与根据过去X发生的事情预测或假设X的给定状态有关?
我知道声明性编程只是传递输入并期望输出而不说明程序是如何完成的.在函数式编程中,是一种编程范例,它接受输入并返回输出.当我检查高阶函数编程时,我们传递一个map/reduce函数,它没有透露程序是如何完成的.高阶函数编程和声明式编程是一样的吗?
大多数教程/文章/书籍在介绍函数式编程时都会讨论副作用.拿这个Python代码:
def isPrime(n):
k = 2
while k < n:
if n % k == 0:
return False
k += 1
return True
Run Code Online (Sandbox Code Playgroud)
文中说上面的功能有局部副作用,我不明白.我看到变量"k"正在发生变化,我不明白它有什么不好.
有人可以给出一个明显的不良副作用的例子,以及如何通过函数式编程来避免它?
对于不是理论计算机科学家的人来说,学习像Haskell或Erlang这样的纯函数语言而不是具有强大功能组件的"不纯"语言(如Python或D编程语言的第2版)有什么优势?我的论点如下:
编辑:通过"不纯"的函数式语言,我真正的意思是具有功能性的强多语言语言,而不是具有一些非功能性能力的强功能语言.