如何编写没有参数的Haskell函数的类型声明?

dan*_*nza 19 haskell

如何在没有参数的情况下编写haskell函数的类型声明?

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与没有参数没有任何关系(后面已经没有->箭头),相反,它意味着也没有返回值,它只是一个"仅副作用"动作.


1实际上,它以一种相关的方式不同:five是一种不变的应用形式,这意味着它的备忘录.如果我以某种迂回方式(例如sum $ 5 : replicate 1000000 0)定义了这样的常数,则即使five在程序运行期间多次评估,也只执行一次冗长的计算.OTOH,无论你在哪里写出来five' (),计算都会重新完成.

  • 它在语法上几乎是每种编程语言中的一个函数,但在Haskell中则不然.这里,_function_有一个非常具体的含义 - 基本上是一个lambda抽象.如果某些东西不允许你将它应用于某个参数,那么它就不是一个函数.阅读[Conal的这篇博客文章](http://conal.net/blog/posts/everything-is-a-function-in-haskell). (11认同)
  • @Infinity:没有观看引用的视频,我认为他们正在讨论一个[无点](https://wiki.haskell.org/Point-free)定义.您可以通过使用合成运算符来定义函数,而无需_explicitly_提及任何参数.但是这样定义的函数肯定也有参数,只是,它们隐含在定义中.如果你愿意的话,`f =(+ 1)`只是`fx = x + 1`的语法糖:两者都定义了一个带有一个参数的函数,但前一种风格避免实际给它起一个名字. (3认同)

Chu*_*uck 10

由于Haskell中的函数是纯的(它们的结果仅取决于它们的参数),所以没有参数的函数的等价物只是一个值.例如,one = 1.