我是Haskell的新手,目前正在通过Real World Haskell。本书说类型构造函数仅用于类型签名,而值构造函数用于实际代码中。它也给出了一个声明的例子,表明两者的名称是相互独立的。为什么首先需要两个构造函数,如果其中只有一个用于实际代码?由于我们不会在实际代码中使用类型构造函数,因此类型构造函数的用途是什么?为什么除了Haskell中的类型构造函数外,还有一个值构造函数?
回答
也许名字有点误导。 A 类型构造函数表示您声明的类型的名称。它们就是这样调用的,因为它们构建的是类型,而不是值:实际上,(可能)对类型变量进行参数化,它们定义了一系列类型。它们的行为类似于C++的模板和Java的泛型。在data MyType a b = Constr a b
中,MyType是一个类型构造函数,它需要两种类型a
和b
来构建一个新类型(MyType a b)
。
A 值构造函数是您在其他(面向对象)语言中称为“构造函数”的唯一部分,因为您需要它来构建该类型的值。因此,在前面的示例中,如果采用值构造函数Constr :: a -> b -> MyType a b
,则可以创建值Constr "abc" 'd' :: MyType [Char] Char
。
请问如何改进我的答案摆脱那-1?怎么了? – 2012-04-20 13:42:09
一种方便的方式来获取有关类型和值的直觉是,前者是编译时值,而后者则是运行时值。换句话说,Type构造函数是Haskell类型集合中值的构造方法,唯一目的是在编译时键入您的程序。这也意味着你不能在运行时构造一个类型,并且你不能在编译时构造一个值。所以,因为你不能在运行时根据类型值显式地分支(尽管你可以隐式地使用类型类型),所以类型构造函数作为运行时对象是完全没用的,并且在很多情况下完全没有最终的二进制。相反,因为值构造函数允许在运行时在它们的类型集合中构造值,所以它们作为编译时对象完全没有用处。
由于这个简单的属性,Type构造函数和Value构造函数可以毫不含糊地共享名称。
这是对来自紧急背景的人的最简单理解! – 2013-06-17 13:36:52
这有点像说“为什么我们需要类和对象,如果对象是唯一实际运行?”
这两种构造函数做不同的工作。类型构造函数进入类型签名。值构造函数进入可运行代码。
在最简单的情况下,类型“构造函数”是只是一个类型名称。在最简单的情况下,一个类型只有一个值构造函数。所以,你的东西落得像
data Point = Point Int Int
你可以对自己说:“现在为什么赫克我需要写Point
两次?”
但现在考虑不那么简单的例子:
data Tree x = Leaf x | Branch (Tree x) (Tree x)
这里Tree
是一个类型构造。你给它一个类型参数,它“构造”一个类型。因此Tree Int
是一种类型,Tree String
是另一种类型,依此类推。 (类似于C++中的模板,或Java或Eiffel中的泛型)。
另一方面,Leaf
是一个值构造函数。给定一个值后,它会生成一个单节点树。所以Leaf 5
是一个Tree Int
值,Leaf "banana"
是一个Tree String
值,依此类推。
类似地对于Branch
。它需要两个树值并构建一个树状节点,并将这些树作为子节点。例如,Branch (Leaf 2) (Leaf 7)
是Tree Int
的值。
感谢您的详细解释! – 2012-04-23 06:28:13
- 1. Haskell函数构造
- 2. 子类构造函数 - 为什么必须为子类构造函数存在默认构造函数?
- 3. 函数构造函数和原型构造函数有什么区别?
- 4. 我可以在外部构造函数中为参数类型构建一个无参数构造函数吗?
- 5. 为什么构造函数改变了?
- 6. 什么类型是构造函数?
- 7. Haskell中的类型构造函数和java泛型类型有什么区别?
- 8. 为什么构造函数不是构造函数?
- 9. 为什么要将原型的构造函数设置为其构造函数?
- 10. 如何在构造函数外访问构造函数的值
- 11. 什么应该是构造函数属性值..a原型构造函数或对象构造函数本身
- 12. 什么类型的java构造函数是这些?构造函数链接?
- 13. 了解F#类型的构造函数
- 14. 为什么没有其他构造函数,除了.edmx中的默认构造函数?
- 15. 为什么具有继承构造函数的类还会获得合成的默认构造函数?
- 16. 为什么System.Data.SqlClient.SqlDataReader没有构造函数
- 17. 构造函数内的构造函数
- 18. 有一个子类的构造函数
- 19. 为什么编译器会抱怨超类没有构造函数,当默认的构造函数被自动赋予一个没有构造函数的类?
- 20. 一类的构造函数
- 21. C#&CLI与值类型和构造函数有什么区别?
- 22. 在构造函数中调用另一个构造函数
- 23. 在Kotlin中有两个不同构造函数的数据类构造函数
- 24. 什么是类型和什么是类型构造函数scala
- 25. 类构造函数
- 26. 第一类函数的函数构造
- 27. 类有不止一个构造函数
- 28. Java:Object类有一个构造函数吗?
- 29. 为什么allocator在构造函数中?
- 30. typecript中的类构造函数类型?
短语“实际代码”是不幸的,因为它暗示你不会在程序中使用类型构造函数,而作者实际上是指类型构造函数仅用于类型注释。这相当于说你在C中不需要关键字“int”或“long”,因为你在实际代码中不使用它们(它们只用于声明中,它不被视为“实际代码“按此标准)。 – 2012-04-20 10:24:30
...不接受? :) – 2012-11-27 14:26:32