如何编写没有参数的Haskell函数的类型声明?
如何编写没有参数的haskell函数的类型声明?由于haskell中的函数是纯函数(它们的结果仅取决于它们的参数),因此没有参数的函数的等价物只是一个值。例如,如何编写没有参数的Haskell函数的类型声明?,haskell,Haskell,如何编写没有参数的haskell函数的类型声明?由于haskell中的函数是纯函数(它们的结果仅取决于它们的参数),因此没有参数的函数的等价物只是一个值。例如,one=1 没有没有没有参数的函数,它只是一个值。当然,你可以写这样的声明: five :: Int five = 5 如果我来的话,它看起来可能更像你要的 five' :: () -> Int five' () = 5 但这完全等同于(除非你写了一些可笑的东西,比如five'undefined)和superfluent1 如果
one=1
没有没有没有参数的函数,它只是一个值。当然,你可以写这样的声明:
five :: Int
five = 5
如果我来的话,它看起来可能更像你要的
five' :: () -> Int
five' () = 5
但这完全等同于(除非你写了一些可笑的东西,比如five'undefined
)和superfluent1
如果你的意思是,在C中
void scream() {
printf("Aaaah!\n");
}
那又不是一个函数,而是一个动作。(C程序员确实称之为函数,但您最好说过程,每个人都会理解。)我上面所说的方法基本相同,您可以使用
scream :: IO()
scream = putStrLn "Aaaah!"
请注意,在这种情况下,空的()
do与没有参数没有任何关系(这是由于没有->
箭头而产生的),相反,它意味着也没有返回值,这只是一个“仅副作用”操作
1实际上,它在一个相关的方面有所不同:
five
是一个,这意味着它被记录下来了。如果我以某种迂回的方式定义了这样一个常数(例如,sum$5:replicate 1000000
),那么即使在程序运行期间多次计算了five
,冗长的计算也只会执行一次。OTOH,无论你在哪里写出five'()
,计算都会重新进行。我认为你需要更清楚地理解“无参数函数”的含义。你的意思是像5
这样的Int
类型的值,还是像f=const 3
这样确实有函数类型但定义时没有任何显式参数的值?f=const 3
有一个类型签名f::b->Integer
。因此它有一个参数,它只是忽略了它。你可以称它为action或procedure,但从语法上讲,它只是一个函数,就像所有其他函数一样。是的,在我的例子中,我实际上想把一些副作用组合在一起,我想知道如何声明预期的返回类型。thanksIt在语法上几乎在所有编程语言中都是一个函数,但在Haskell中不是。在这里,函数有一个非常具体的含义——基本上是lambda抽象。如果某些东西不允许你将其应用于某个参数,那么它就不是一个函数。阅读。那么你应该用什么来代替呢?你怎么能在每个函数的作用域中放置一个值?@Max:在顶级声明的任何值都将在每个函数的作用域中,无需执行任何操作。(当然,对于那些不是函数的东西…@Infinity:如果没有看过参考视频,我想他们谈论的是一个定义。您可以通过使用组合运算符来定义函数,而无需显式提及任何参数。但是用这种方式定义的函数肯定也有参数,只是它们在定义中是隐式的。如果愿意的话,f=(+1)
只是fx=x+1
的语法糖:两者都用一个参数定义函数,但前者避免实际给它命名。