【发布时间】:2015-02-01 10:27:20
【问题描述】:
在前奏中,我刚刚检查了 () 的类型,它的真正含义是什么
Prelude> :type ()
() :: ()
我知道当你不想做任何事情时,你可以从函数中返回 this。那里到底发生了什么?
【问题讨论】:
标签: haskell functional-programming
在前奏中,我刚刚检查了 () 的类型,它的真正含义是什么
Prelude> :type ()
() :: ()
我知道当你不想做任何事情时,你可以从函数中返回 this。那里到底发生了什么?
【问题讨论】:
标签: haskell functional-programming
正如 Lee 所说,() 恰好是一个类型的名称,也是它唯一的构造函数。基本上和你定义的一样
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?。
【讨论】:
()(发音为单位)既是类型的名称,也是该类型的单个值。因此它说“() 的值具有() 类型”,其方式与
:t "Hello"
"Hello" :: String
【讨论】: