【问题标题】:How to write the type declaration of an Haskell function with no arguments?如何编写没有参数的 Haskell 函数的类型声明?
【发布时间】:2014-01-08 22:26:29
【问题描述】:

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

【问题讨论】:

  • 我认为您需要更清楚地了解“没有参数的函数”的含义。你的意思是像5 类型的Int 之类的值,还是真正具有函数类型但没有任何显式参数定义的东西,例如f = const 3
  • f = const 3 有一个类型签名 f :: b -> Integer。因此它有一个论点,它只是忽略它

标签: haskell


【解决方案1】:

没有没有参数的函数,它只是一个值。当然,你可以写这样的声明:

five :: Int
five = 5

如果我做到了,它可能看起来更像你要求的东西

five' :: () -> Int
five' () = 5

但这完全等价(除非你写了像five' undefined 这样荒谬的东西)和超流利的1

如果你的意思是类似的,在 C 中

void scream() {
  printf("Aaaah!\n");
}

那么这又不是一个函数而是一个动作。 (C 程序员确实称它为函数,但你最好说 procedure,每个人都会明白。)我上面所说的几乎相同,你会使用

scream :: IO()
scream = putStrLn "Aaaah!"

请注意,在这种情况下,空的() do 与没有参数没有任何关系(这已经从缺少-> 箭头开始),而是意味着也没有返回值,这只是一个“只有副作用”的操作。


1实际上,它在一个相关方面有所不同:fiveconstant applicative form,这意味着它被记忆了。如果我以某种迂回的方式定义了这样一个常量(例如sum $ 5 : replicate 1000000 0),那么即使在程序运行期间多次评估five,冗长的计算也只会执行一次。 OTOH,无论您在哪里写出five' (),都会重新进行计算。

【讨论】:

  • 你可以称它为 actionprocedure,但在语法上它只是一个函数,就像所有其他函数一样,是的,在我的情况下,我实际上想将一些副作用组合在一起,我想知道如何声明预期的返回类型。谢谢
  • 它在语法上几乎是所有编程语言中的一个函数,但在 Haskell 中却不是。在这里,function 有一个非常具体的含义——基本上,一个 lambda 抽象。如果某些东西不允许你将它应用到某个参数上,那么它就不是一个函数。阅读this blog post by Conal
  • 那你应该改用什么?如何为每个函数赋予一个值?
  • @Max:在顶层声明的任何值都将在每个函数的范围内,无需执行任何操作。 (当然,也适用于非函数的东西......)
  • @Infinity:没有看过引用的视频,我认为他们在谈论point-free 定义。您可以通过使用组合运算符来定义一个函数而不显式 提及任何参数。但是以这种方式定义的函数肯定也有参数,只是它们隐含在定义中。如果你愿意,f = (+1) 只是f x = x+1 的语法糖:两者都使用一个参数定义一个函数,但前一种风格实际上避免给它一个名字。
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-02-07
    • 2017-07-08
    • 1970-01-01
    • 1970-01-01
    • 2012-02-16
    • 2022-10-13
    • 1970-01-01
    相关资源
    最近更新 更多