如果函数式编程语言不能保存任何状态,他们如何做一些简单的事情,比如从用户那里读取输入?他们如何"存储"输入(或存储任何数据?)
例如:这个简单的C语言如何转换为像Haskell这样的函数式编程语言?
#include<stdio.h>
int main() {
int no;
scanf("%d",&no);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
(我的问题受到了这篇优秀文章的启发:"名词王国的执行".阅读它让我更好地理解了什么是面向对象的编程,Java如何以一种极端的方式实现它,以及函数式编程语言是如何实现的对比.)
oop paradigms haskell programming-languages functional-programming
在功能编程方面触及Monads之后,该功能是否实际上使语言变得纯粹,或者它是否只是另一个"从监狱免费卡中获取"来推理现实世界中的计算机系统,在黑板数学之外?
编辑:
这不是有人在这篇文章中所说过的火焰诱饵,而是一个真正的问题,我希望有人可以用枪击我说,证明,这是纯粹的.
此外,我正在研究关于其他不那么纯粹的功能语言和一些使用良好设计和比较纯度的OO语言的问题.到目前为止,在我非常有限的FP世界中,我仍然没有理解Monads的纯度,你会很高兴地知道我喜欢不变性的想法,这在纯度赌注中更为重要.
monads haskell functional-programming referential-transparency
monad构造如何帮助维持纯度(在Haskell中),同时做出不纯净的东西?例如,当你给出的print "Hello"是执行纯粹或不纯的代码时?这是一个非常微妙的细节,但有助于更好地理解功能语言中纯度和杂质的概念.
此代码(取自Learn You A Haskell):
main = do putStr "Hey, "
putStr "I'm "
putStrLn "Andy!"
Run Code Online (Sandbox Code Playgroud)
显然是个傻瓜
main = putStr "Hey, " >>=
(\_ -> putStr "I'm " >>=
(\_ -> putStrLn "Andy!"))
Run Code Online (Sandbox Code Playgroud)
其中,正如我所理解的那样可以解释为"为了放入斯特伦"安迪!"我首先要把putStr"我是",为了做到这一点,我首先要把putStr"嘿,";
我不同意这种解释,这很烦人,因为编译器显然不会让我感到困惑.我遇到的问题是,lambdas忽略了他们的论点,在懒惰的评估期间,这种事情是不是应该被识别和短路?
此外,当然,绑定会返回IO操作,当IO操作进入main时,它会被执行.但是什么阻止它打印"嘿,安迪!我是"?我怀疑这是绑定正在做什么.
此外,类型"IO()"的IO操作如何携带足够的信息以允许运行时系统打印"嘿,我是安迪!"?IO()与IO()的不同之处在于打印"Hello World!" 或写入文件?
考虑另一个,来自monad的维基百科页面:
加糖版:
do
putStrLn "What is your name?"
name <- getLine
putStrLn ("Nice to meet you, " ++ name ++ "!")
Run Code Online (Sandbox Code Playgroud)
Desugared版本:
putStrLn "What is your name?" >>=
(\_ ->
getLine >>=
(\name ->
putStrLn ("Nice to meet you, " …Run Code Online (Sandbox Code Playgroud) 我的问题是haskell中的monad是否真的保持了hakell的纯度,如果是的话.我经常读到副作用是如何不纯的,但有用的程序(例如i/o)需要副作用.在下一句中,声明haskell的解决方案是monads.然后monad在某种程度上被解释,但实际上并不是他们如何解决副作用问题.
我已经看到了这个和这个,我对答案的解释实际上就是我自己读到的那个 - IO monad的"动作"不是i/o本身,而是执行时执行的对象/ O.但是我发现可以为任何代码或任何已编译的可执行文件创建相同的参数.难道你不能说C++程序只在编译代码执行时产生副作用吗?所有的C++都在IO monad中,所以C++是纯粹的?我怀疑这是真的,但我老实说不知道它不是以什么方式存在.事实上,Moggi(sp?)最初是否使用monads来模拟命令式程序的指称语义?
一些背景:我是haskell和函数式编程的粉丝,我希望随着我的学习继续学习更多.例如,我理解参考透明度的好处.这个问题的动机是我是一名研究生,我将为编程语言课提供2个1小时的演示文稿,其中一个特别涉及haskell,另一个涉及函数式编程.我怀疑大多数班级不熟悉函数式编程,可能已经看过一些方案.我希望能够(合理地)清楚地解释monad如何解决纯度问题而不进入类别理论和monad的理论基础,我没有时间去讨论,无论如何我不完全了解自己 - 当然还不够好.
我想知道在这种情况下"纯度"是不是真的很明确?