()在Haskell中意味着什么

时间:2015-10-13 20:54:02

标签: haskell

在一些Haskell代码中,我遇到了:

put :: s -> m ()

()在这里意味着什么?

我使用搜索引擎,但找不到能正确处理()的搜索引擎。

4 个答案:

答案 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)。