lef*_*out 47
没有参数的函数就没有,这只是一个值.当然,你可以写下这样的声明:
five :: Int
five = 5
Run Code Online (Sandbox Code Playgroud)
如果我做的话,它可能看起来更像你要求的东西
five' :: () -> Int
five' () = 5
Run Code Online (Sandbox Code Playgroud)
但这完全相同(除非你写出一些荒谬的东西five' undefined
)和超级流畅的1.
如果你的意思是类似的,在C中
void scream() {
printf("Aaaah!\n");
}
Run Code Online (Sandbox Code Playgroud)
然后,这又不是一个功能,而是一个动作.(C程序员确实称它为函数,但你最好说程序,每个人都会理解.)我上面说的几乎一样,你用的
scream :: IO()
scream = putStrLn "Aaaah!"
Run Code Online (Sandbox Code Playgroud)
请注意,()
在这种情况下,空的do与没有参数没有任何关系(后面已经没有->
箭头),相反,它意味着也没有返回值,它只是一个"仅副作用"动作.
five
是一种不变的应用形式,这意味着它的备忘录.如果我以某种迂回方式(例如sum $ 5 : replicate 1000000 0
)定义了这样的常数,则即使five
在程序运行期间多次评估,也只执行一次冗长的计算.OTOH,无论你在哪里写出来five' ()
,计算都会重新完成.