Types and Functions lecture显示功能:
f44 :: () -> Integer
f44 () = 44
我输入了以下内容:
ghci> let f () = 5
ghci> f ()
5
但是,我对()
中的let f ()
感到困惑。通常,作为初学者,我在函数名称后面看到了一个不可变变量,即f
。
在()
之后列出let f ...
的名称是什么?如何在函数应用程序f ()
中使用它?
答案 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