在一些Haskell代码中,我遇到了:
put :: s -> m ()
()
在这里意味着什么?
我使用搜索引擎,但找不到能正确处理()
的搜索引擎。
答案 0 :(得分:32)
()
表示“无聊”。这意味着无聊的类型包含一件事,也很无聊。通过将无聊类型的一个元素与另一个元素进行比较,没有什么有趣的,因为通过给予你任何注意力,没有什么可以学习无聊类型的元素。
它与Haskell Void
中称为(我希望选择了一个更好的名字,如我所建议的人)的空类型非常不同。空的类型是非常令人兴奋的,因为如果有人给你一个属于它的价值,你知道你已经死了,在天堂,你想要的任何东西都是你的。
但如果有人在()
给你一个值,那就不要激动了。把它扔掉。
有时采用由“元素类型”参数化的类型构造函数并使用()
填充参数很有趣。您可以看到类型构造函数中固有的信息,而不是来自元素。例如,Maybe ()
是Bool
的版本,Just ()
或Nothing
。此外,[()]
相当于(可能是无限的)自然数:您拥有的唯一信息是长度。
所以,()
的意思是“无聊”,但这通常是一个有趣的事情发生在其他地方的线索。
答案 1 :(得分:16)
如果不是奇怪的特殊语法,可以将其定义为
data () = ()
这是最无聊的类型。语法应该让你想到元组:(a,b)
是一对,(a,b,c)
是三元组等,()
是0元组。唯一缺少的是1元组,它不能具有该语法,因为它会与通常使用的括号冲突。
()
经常被用作没有趣味结果的结果。例如,应该执行某些I / O并在不生成结果的情况下终止的IO
操作通常具有类型IO ()
。它也可以在你需要一些无趣的输入时使用; GHC对此有特殊的语法,但在Haskell 98中,模仿Lisp的cond
的方式是这样的:
case () of
() | c1 -> e1
| c2 -> e2
...
| otherwise -> e3
询问你所拥有的()
类型的价值是完全有效的,但也非常无聊;你只能拥有一个合法的。
从“Haskell-as-almost-category”的角度来看,()
是最终对象。也就是说,对于任何类型X
,只有一个类型X -> ()
的合法函数,即const ()
。从另一个方向来看,Void
类型的pigworker提到的是初始对象。对于任何类型X
,只有一个类型Void -> X
的合法函数,即absurd
。如果您有分类推理的心情,那么初始和最终对象可能很有用。
答案 2 :(得分:5)
有专门针对Haskell的优秀搜索引擎。
http://hayoo.fh-wedel.de/?query=()会立即给出正确答案:
<小时/> 单位数据类型
Data
()
ghc-prim -GHC.Tuple
()
有一个非未定义的成员,即无效的构造函数()
。
答案 3 :(得分:3)
它被称为"unit type"。在某些方面,您可以将其视为Haskell等同于dt <- data.table::fread("flights.csv")
write_and_read <- function() {
write.csv(dt, tempfile(), row.names=FALSE)
read.df(sqlContext, "flights.csv",
source = "com.databricks.spark.csv",
header = "true",
inferSchema = "true"
)
}
## Unit: seconds
## expr min lq mean median
## write_and_read() 2.924142 2.959085 2.983008 2.994027
## uq max neval
## 3.01244 3.030854 3
。它只有一个值(也是void
)。