Haskell 哈斯克尔初学者

Haskell 哈斯克尔初学者,haskell,maybe,Haskell,Maybe,我不明白为什么我从GHCi那里得到以下回复。可能不是一个构造函数吗 Prelude> :t Maybe <interactive>:1:1: Not in scope: data constructor `Maybe' Prelude> let e = Maybe 5 <interactive>:1:9: Not in scope: data constructor `Maybe' 前奏曲>:t可能 :1:1:不在范围内:数据构造函数'Maybe' 前奏

我不明白为什么我从GHCi那里得到以下回复。
可能不是一个构造函数吗

Prelude> :t Maybe

<interactive>:1:1: Not in scope: data constructor `Maybe'
Prelude> let e = Maybe 5

<interactive>:1:9: Not in scope: data constructor `Maybe'
前奏曲>:t可能
:1:1:不在范围内:数据构造函数'Maybe'
前奏曲>让e=5
:1:9:不在范围内:数据构造函数'Maybe'
可能是类型名。该类型的构造函数是
Just
Nothing
,因此Maybe类型的实际值可以是
Just 5
(对于有值要返回的情况)或
Nothing
(对于空情况)。

Maybe
是,它的两种可能是
Nothing
Just
。所以你必须说
只有5个
,而不是
也许5个

> let x = Just 5
> x
Just 5
> let y = Nothing
> y
Nothing
> :type x
x :: Maybe Integer
> :type y
y :: Maybe a
> :info Maybe
data Maybe a = Nothing | Just a     -- Defined in Data.Maybe
instance Eq a => Eq (Maybe a) -- Defined in Data.Maybe
instance Monad Maybe -- Defined in Data.Maybe
instance Functor Maybe -- Defined in Data.Maybe
instance Ord a => Ord (Maybe a) -- Defined in Data.Maybe
instance Read a => Read (Maybe a) -- Defined in GHC.Read
instance Show a => Show (Maybe a) -- Defined in GHC.Show
Maybe
是一个类型构造函数,因为它用于构造新类型(结果类型取决于
Maybe a
a
的类型),其中这样的类型可能是
Maybe Int
(注意,不再有类型参数
a
,即所有类型参数都是绑定的)
Just a
Nothing
是数据构造函数,因为它们用于构造某个
可能
类型的实例,例如
Just Int
创建
可能
的实例

另一个主要区别是,您只能在模式匹配时使用数据构造函数。你不能说:

case foo of
     Maybe a -> ...
你必须说:

case foo of
     Just a  -> ...
     Nothing -> ...

@是的,已经修好了。不过,谢谢你抓住它。我想到的是OCaml。似乎到目前为止,阅读教程让我对类型构造函数和数据构造函数有点困惑。语法是相同的,根据教程的附加段落,Just a也是类型构造函数(??)参数化类型类似于其他语言中的“泛型”或“模板”类型。参数化类型接受一个或多个类型参数。例如,标准前奏曲类型可能定义如下:数据可能a=Nothing | Justa@DavidKramf更新我的答案。如果您仍然发现任何不清楚的地方,请随时通知我。@IonuțG.Stan:a
中的
a
:可能a
与您定义的
a
不同。也许你应该使用变量
x
y
,而不是
a
b
,以避免字母冲突?这两个答案都完全正确,但我还想指出,
maybe
(小写字母m)是一个函数,类型为
b->(a->b)->maybe->b
:“maybe函数接受默认值、函数和maybe值。如果Maybe值为Nothing,则函数返回默认值。否则,它将函数应用于Just中的值并返回结果。”