创建打印并返回值的haskell函数

时间:2014-11-14 22:30:12

标签: haskell

这是我的功能:

foo :: Int -> Int
foo i = do
    putStrLn "Foo Function has run!"
    return (i*2)

上面有编译时错误。

如果我这样做,我希望如此:

bar = foo 6

bar将是12。

但是当首次运行该函数时,它会输出字符串“Foo Function has run!” 我怎么能这样做?

2 个答案:

答案 0 :(得分:8)

您必须将该功能转换为IO操作。 Haskell严格强制您将执行IO的代码与不具有代码的代码分开:

foo :: Int -> IO Int
foo i = do
    putStrLn "Foo Function has run!"
    return (i * 2)

然后,您可以在另一个IO函数中提取此值:

main :: IO ()
main = do
    bar1 <- foo 6
    bar2 <- foo bar1
    print (bar1, bar2)

Haskell选择这条路线的原因有很多种,但有些重要的(没有特别的顺序)是:

  • 可测试性。任何函数都更容易测试,因为它总是只依赖于它的输入,而不是取决于应用程序的状态
  • Equational reasoning。这意味着您可以将您的代码推理为好像只是花哨的数学函数。您可以更轻松地对代码进行随机播放。
  • 编译器优化。如果没有副作用,编译器可以自由选择何时以及如何调用函数,它可以将调用推迟到以后,并且它可以在编译的代码中使内部循环非常紧密,运行速度更快。
  • 组合性。 Haskell类型系统非常丰富,以这种方式隔离类型实际上允许您编写比C#,Java或Python更多的抽象。
  • 代码清晰度。如果你看到一个函数只返回一个值而不是一个IO动作,你会立即对该函数有很多了解。这种类型的签名是一种承诺,您不必担心该功能可能会破坏您的应用程序。另一方面,如果确实返回IO操作,则表示您必须更加小心。

答案 1 :(得分:0)

请放心,使用trace :: String -> a -> a中的Debug.Trace