【发布时间】:2009-12-20 21:23:30
【问题描述】:
Haskell 是一种纯函数式语言,这意味着 Haskell 函数没有副作用。 I/O 是使用代表 I/O 计算块的 monad 实现的。
是否可以测试 Haskell I/O 函数的返回值?
假设我们有一个简单的“hello world”程序:
main :: IO ()
main = putStr "Hello world!"
我是否可以创建一个可以运行main 的测试工具并检查它是否返回正确的“值”?或者 monad 应该是不透明的计算块这一事实是否会阻止我这样做?
注意,我并不是要比较 I/O 操作的返回值。 我想比较 I/O 函数的返回值 - I/O monad 本身。
由于在 Haskell 中 I/O 是返回而不是执行,我希望检查 I/O 函数返回的 I/O 计算块,看看它是否正确。我认为这可以允许 I/O 函数以一种在 I/O 是副作用的命令式语言中无法进行的单元测试。
【问题讨论】:
-
Monad 不一定是“不透明”的计算块。例如,List 和 Maybe monad 具有应用程序可见的行为 - IO monad 是唯一(据我所知)专门设计用于将程序逻辑与其某些行为隔离开来的。
-
Control.Monad.ST 也是相当不透明的。
-
我不太擅长计算理论的东西。但这不等同于停机问题吗?我的意思是,您将拥有一个返回程序(IO 操作)的函数,并希望编写另一个程序来静态分析它的正确性。这是描述问题的有效方式吗?这是可判定的吗?
标签: unit-testing haskell functional-programming