这种声明式I/O方法有什么问题

Zor*_*orf 2 functional-programming side-effects logic-programming declarative-programming

我不确定这与"程序语言设计"相反的"编程"究竟有多少.但问题是:

说,为了简单起见,我们有两个'特殊'列表/数组/向量/为了简单我们只称为'端口',一个叫做stdIn另一个stdOut.这些概念上分别代表

  • 在程序持续时间内给予程序的所有用户输入
  • 在程序持续期间写入终端的所有输出

在Haskell启发的伪代码中,应该可以创建这个完全声明性的程序:

 let stdOut =   ["please input a number", 
                "and please input another number", 
                "The product of both numbers is: " ++ stdIn[0] * stdIn[1]]
Run Code Online (Sandbox Code Playgroud)

哪个会做到预期,要求两个数字,并打印他们的产品.诀窍是stdOut表示在程序完成时写入终端的字符串列表,stdIn是输入字符串列表.键入错误以及需要一些安全措施才能在输入新行后仅打印下一行这一事实为了简单起见而留在这里,它可能很容易解决.

所以,在我实施这个想法之前,我忽略了它有什么陷阱吗?我不知道已经存在类似的结构,所以不考虑我忽略了一个明显的陷阱是天真的.

否则,我当然知道:

 let stdOut =   [stdIn[50],"Hello, World!"]
Run Code Online (Sandbox Code Playgroud)

如果这些结果需要以与上述类似的方式交织,那将是一个错误.

小智 6

在Haskell的早期版本中使用了类似的方法,除了stdin和stdout通道的元素不是字符串而是通用IO'动作' - 实际上,输入和输出被推广为'响应'和'请求'.只要两个通道都是惰性的(即它们实际上是"迭代器"或"枚举器"),运行时就可以简单地遍历请求通道,对每个请求执行操作并将适当的响应添加到响应通道上.不幸的是,该系统非常难以使用,因此它被废弃以支持monadic IO.见这些文章:

  • Hudak,P.和Sundaresh,R.关于纯功能I/O系统的表现力.技术.代表YALEU/DCS/RR-665,耶鲁大学计算机科学系,1989年3月.
  • Peyton Jones,S.解决尴尬的小队:Haskell中的monadic输入/输出,并发,异常和外语调用.在工程理论的软件建设,2002年,第47-96页.


Nor*_*sey 5

您描述的方法听起来像"对话".在他们屡获殊荣的1993年论文" 命令功能编程"中,Phil Wadler和Simon Peyton Jones举了一些例子,其中对话框确实不能很好地运行,并且它们解释了为什么monadic I/O更好.