我是一个完全的新手,目前正在尝试使用“Learn You a Haskell for Great Good”学习Haskell。我已经达到the section explaining how to work with command line arguments,并且有些东西困扰着我。

根据我的理解(和haskell.org's definition), Action 旨在封装副作用。命令行参数是程序给定实例的不可变输入,那么使用getProgName :: IO String而不是getProgName :: String有什么意义呢?换句话说:防止纯函数调用getProgName有什么意义?

更新

到目前为止,我对这个问题有很好的答案。我接受Don Stewart's是最简单,最简洁的方法,但是Conal's(及其相关的blog post)绝对值得一读。

最佳答案

首先,getArgs可以在运行时更改。参见 withArgs

其次,getArgsgetProgName属于一类有趣的不纯计算-它们在程序运行期间被视为常量,但是,它们在编译时不是可用的值,它们从一个程序运行转换为另一个程序。他们没有明确的外表。

参见例如较早的discussions,其中讨论了getArgs和浮点计算。甚至minBound / maxBound都可以认为是此类。

关于haskell - 为什么要使用getArgs和getProgName IO操作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14295582/

10-09 00:09