()函数变量和应用程序

时间:2015-04-30 14:08:57

标签: haskell

Types and Functions lecture显示功能:

f44 :: () -> Integer
f44 () = 44

我输入了以下内容:

ghci> let f () = 5
ghci> f ()
5

但是,我对()中的let f ()感到困惑。通常,作为初学者,我在函数名称后面看到了一个不可变变量,即f

()之后列出let f ...的名称是什么?如何在函数应用程序f ()中使用它?

3 个答案:

答案 0 :(得分:9)

“()”通常发音为“unit”。

在Haskell中,它是一个类型的名称,如

中所示
f44 :: () -> Integer

以及该类型中唯一存在的值的名称,如

中所示
f44 () = 44

用于模式匹配。

这个更熟悉的定义将提供一个等效但更详细的类型:

data Unit = Unit
f45 :: Unit -> Integer
f45 Unit = 45

没有什么可以阻止你将()绑定到名称,就像你可以用于任何其他值一样:

Prelude> let f () = 5
Prelude> :t f
f :: Num a => () -> a
Prelude> let name = ()
Prelude> :t name
name :: ()
Prelude> name
()
Prelude> f name
5

答案 1 :(得分:2)

这个功能没有什么特别之处:

f44 :: () -> Integer
f44 () = 44

这里要理解的关键是()是只有一个居民值()的类型。因此,()类型的值只能为()。事实上它defined是这样的:

data () = ()

当您在ghci中执行此操作时:

λ> let f () = 5

您正在创建Num a => () -> a类型的函数。您可以 在ghci检查你自己:

λ> :t f
f :: Num a => () -> a
  

在让f ...之后列出的()的名称是什么?

您正在使用模式匹配来实现一个函数f,其值()会为您提供5

  

在函数应用程序f()?

中何时使用它

它是通常的功能应用程序。您正在将()值应用于函数f,并根据您的函数定义生成5

答案 2 :(得分:1)

()被称为单位或空元组。它没有任何价值。

在函数定义中,=左侧的括号通常仅用于匹配函数参数。

在您的示例中,()几乎没用。如果没有它,你的函数就可以工作,那么它将是一个零参数函数。

f44 :: Integer
f44 = 44