如何编写没有参数的haskell函数的类型声明?
答案 0 :(得分:44)
没有没有参数的函数,这只是一个值。当然,你可以写下这样的声明:
five :: Int
five = 5
如果我做的话,它可能看起来更像你要求的
five' :: () -> Int
five' () = 5
但这完全相同(除非你写了像five' undefined
这样荒谬的东西)和superfluent 1 。
如果您的意思是类似的话,在C
void scream() {
printf("Aaaah!\n");
}
然后,这又不是一个功能,而是一个动作。 (C程序员确实称它为函数,但你最好说 procedure ,每个人都会理解。)我上面所说的几乎一样,你用的是
scream :: IO()
scream = putStrLn "Aaaah!"
请注意,在这种情况下,空()
与没有参数(由于缺少->
箭头已经存在)没有任何关系,相反,它意味着也没有返回值,它只是一个"只有副作用"动作。
<小时/> 1 实际上,它在一个相关方面有所不同:
five
是constant applicative form,这意味着它被记忆了。如果我以某种迂回方式定义了这样的常量(例如sum $ 5 : replicate 1000000 0
),那么即使在程序运行期间多次评估five
,也只执行一次冗长的计算。 OTOH,无论你在哪里写出five' ()
,计算都会重新进行。
答案 1 :(得分:9)
由于Haskell中的函数是纯的(它们的结果仅取决于它们的参数),所以没有参数的函数的等价物只是一个值。例如,one = 1
。