根据我的理解,Maybe类型是你可以与另一种类型结合的东西.它允许您使用"Just ... Nothing"格式为您组合输入的条件指定条件.
我演讲幻灯片中的一个例子是Haskell中的一个函数,它给出了输入的平方根,但在这之前,检查输入是否为正:
maybe_sqrt :: Maybe Float -> Maybe Float
maybe_sqrt maybe_x = case maybe_x of
Just x
| x >= 0 -> Just (sqrt x)
| otherwise -> Nothing
Nothing -> Nothing
Run Code Online (Sandbox Code Playgroud)
但是,我不明白为什么这个功能同时使用案件和警卫.为什么你不能像这样使用警卫?:
maybe_sqrt :: Maybe Float -> Maybe Float
maybe_sqrt x
| x >= 0 = Just (sqrt x)
| otherwise = Nothing
Run Code Online (Sandbox Code Playgroud)
该
Maybe类型是你可以用另一种类型的结合
Maybe是不是一个类型†.它是一个类型构造函数,即您可以使用它来生成类型.例如,Maybe Float是一种类型,但它与此类型不同Float.A Maybe Float不能用作Float因为,好吧,也许它不包含一个!
但要计算平方根,你需要一个Float.好吧,没问题:在这种Just情况下,你可以通过模式匹配打开它!但是,模式匹配自动阻止您试图解开一个Float出来的Nothing值,其中,好了,不包含浮动,你可以对比任何东西.
顺便说一下,这并不意味着您需要通过模式匹配跟踪每个可能的故障,一直到您的代码.幸运的是,Maybe是一个单子.这意味着,如果您的功能是Kleisli箭头
maybe_sqrt :: Float -> Maybe Float
maybe_sqrt x
| x >= 0 = Just (sqrt x)
| otherwise = Nothing
Run Code Online (Sandbox Code Playgroud)
(这很好,因为它确实接受一个普通的浮点数)然后你仍然可以使用a Maybe Float作为参数:
GHCi> maybe_sqrt =<< Just 4
Just 2.0
GHCi> maybe_sqrt =<< Just (-1)
Nothing
GHCi> maybe_sqrt =<< Nothing
Nothing
Run Code Online (Sandbox Code Playgroud)
† 正如评论中所讨论的那样,对于我们是否应该调用Maybe 类型或仅仅是类型级实体存在一些分歧.根据Luis Casillas的研究,将它称为类型实际上相当不错.
无论如何:我的观点是,这Maybe Float不是" Maybe类型(给出失败)和Float类型(给出值)的OR组合",而是具有结构Maybe a和可选包含元素的全新类型Float.