【发布时间】:2021-12-17 23:11:34
【问题描述】:
为什么 Haskell 中的类型必须在类型构造函数参数中显式参数化?
例如:
data Maybe a = Nothing | Just a
这里a 必须指定类型。为什么不能只在构造函数中指定?
data Maybe = Nothing | Just a
他们为什么从设计的角度做出这个选择?一个比另一个好?
我确实知道第一个比第二个的类型更强,但甚至没有第二个选项。
编辑:
示例函数
data Maybe = Just a | Nothing
div :: (Int -> Int -> Maybe)
div a b
| b == 0 = Nothing
| otherwise = Just (a / b)
【问题讨论】:
-
在您的示例中,
Just True和Just 42的类型是否相同?如果是这样,您是否看到任何可能导致的问题?如果不是,您认为会有什么不同? -
不是更“强”的类型;它的不同类型。
data Maybe = ...定义了类似Type的东西,而data Maybe a = ...定义了类似Type -> Type的东西。以不同的方式编写不同的东西会更简单,而不是必须推断出两种不同的东西中的哪一种。 -
特别是
ExistentialQuantification和RankNTypes扩展,你可以写data EMaybe = ENothing | forall a. EJust a和data R2Maybe = R2Nothing | R2Just (forall a. a),GHC会接受它们。这样做可能很有启发性,然后尝试一些适用于它们的Maybe的基本示例,看看会发生什么。 -
考虑类似
data Either = Left a | Right b。Either String Int和Either Int String是否相同?如果是这样,Left 3和Left "foo"之间有什么区别?如果不是,是Left 3正确还是Left "foo"正确? -
您最后添加的示例仅显示创建这样的值。但@JosephSible-ReinstateMonica 问题的第二部分同样重要:然后你将如何使用该值?
标签: haskell types functional-programming