为什么Haskell的主要功能需要IO操作?

时间:2017-08-30 23:19:03

标签: haskell

Haskell是一种纯函数式语言,因此像File IO这样的方面变得比大多数其他编程语言更复杂,因为状态可以存储在文件中。为了解决这些问题,Haskell有许多额外的语法和操作来处理文件。我理解需要以及为什么有必要。我感到困惑的是,为什么这是main的输入和输出所必需的?

一个Haskell程序,它读取命令行参数和标准输入 并写入标准输出看起来像这样:

import System.Environment

main = do
   progName <- getProgName
   args <- getArgs
   contents <- getContents  
   putStr (operateOn contents)

这很烦人,因为main不是纯函数,必须通过文件IO操作才能访问程序的输入。然而,它在语义上是纯粹的&#34;因为它在返回stdout内容时需要progNameargs和stdin。在我看来,Haskell重新构建main以将输入作为参数并返回输出将更有意义。考虑以下假设函数:

pureMain :: String -> [String] -> String -> String
pureMain progName args stdin = operateOn stdin

此版本的main是纯粹的,并在返回结果时直接接受其输入作为参数。在整个程序的执行过程中,每个输入的值都不会改变,而stdin可能是一个懒惰评估的潜在无限字符串。懒惰也适用于标准输出,因为每条线都可以单独打印,而不需要评估整个潜在无限标准。

我可以理解一些实现细节,导致stdin和stdout需要文件IO,因为无论如何它们在技术上都是文件描述符。像日志记录这样的事情也需要使用putStr,这会使这个&#34;将stdout作为字符串返回&#34;模型有点不切实际。

即使遇到这些问题,我也没有理由认为progNameargs不能作为参数传递。就此而言,甚至可以传入开始时间或随机数种子。只要他们不改变执行中期并在Haskell运行时提供钩子来指定特定的时间或种子,那么它应该是完全纯粹和可重复的。

这个想法似乎太明显了,没有尝试过,所以我很好奇为什么没有为Haskell做过?是否有一些我失踪的东西打破了这个模型,需要这些是IO感知呼叫?

0 个答案:

没有答案