在前奏中我刚检查了()的类型是什么意思
Prelude> :type ()
() :: ()
我知道当你不想做任何事情时,你可以从函数中返回它。那里到底发生了什么?
答案 0 :(得分:8)
正如李所说,()
恰好是一个类型的名称,也是它唯一的构造函数。基本上,它与您定义的
data Unit = Unit
f :: Unit -> Int
f Unit = 7
......当构造函数不是nullary时,可能不那么令人困惑:
newtype MyInt = MyInt Int
g :: MyInt -> Int
g (MyInt i) = i
请注意,在每种情况下,两个“相等”的名称都存在于完全独立的名称空间中:将示例读作
data TʏᴘᴇSᴄᴏᴘᴇ.Unit = VᴀʟᴜᴇSᴄᴏᴘᴇ.Unit
newtype TʏᴘᴇSᴄᴏᴘᴇ.MyInt = VᴀʟᴜᴇSᴄᴏᴘᴇ.MyInt Int
VᴀʟᴜᴇSᴄᴏᴘᴇ.MyInt 7 :: TʏᴘᴇSᴄᴏᴘᴇ.MyInt
VᴀʟᴜᴇSᴄᴏᴘᴇ.Unit :: TʏᴘᴇSᴄᴏᴘᴇ.Unit
VᴀʟᴜᴇSᴄᴏᴘᴇ.() :: TʏᴘᴇSᴄᴏᴘᴇ.()
您的表征
从程序的角度来看,我知道当你不想做任何事情时,你可以从函数中返回
是正确的,但在Haskell中“做任何事情”并不是一个有意义的事情:函数从不“做任何事”,它们只是屈服结果。结果类型为()
的函数也不例外:它产生一个结果,只有结果不包含实际信息。
有关详细信息,请参阅What is () in Haskell, exactly?。
答案 1 :(得分:3)
()
(发音为unit)既是类型的名称,也是该类型的单个值。因此,与“
()
的类型()
”也是如此
:t "Hello"
"Hello" :: String