将列表的第一个元素作为Maybe vs Maybe元素获取

时间:2019-01-03 02:14:56

标签: functional-programming

在Haskell或fp语言中,我们可能有单子(Option,Some,None)。名称可能会有所不同。

所以可以说我有函数返回list的第一个元素,如果为空,则返回None。

headm [] = None()
headm (x:xs) = Some(x)

所以现在我有了函数,它可以从map和key中获取所有值,例如:

keyValues ['name','age'] {age:24} // [None, Some(24)]

我知道地图语法不正确,但代码仅用于演示目的。

因此,如果我在空列表上调用headm,我将一无所获。

如果我调用上面结果的标题,我也会得到None。

我的问题是这令人困惑,因为对于空列表,如果列表的头都没有,我会得到相同的结果。

这是一种好习惯吗,我应该检查列表是否为空吗?

1 个答案:

答案 0 :(得分:2)

如果我对您的理解正确,那么您提出问题的前提实际上是不正确的,因为将None应用于{{1 }}您已描述的列表。相反,您会得到headm

要使用Haskell示例使事情更具体,我们可以将[None, Some(24)]定义为 1

Some(None)

如果将其应用于空列表,则确实会得到headm

headm :: [a] -> Maybe a
headm []     = Nothing
headm (x:xs) = Just x

但是,如果我们将其应用于列表Nothing

ghci> headm []
Nothing

这是两个不同的值(这就是为什么它们以不同的方式打印)的原因,它们彼此不相等。值[Nothing, Just 24]ghci> headm [Nothing, Just 24] Just Nothing 等也存在并且彼此不同(实际上,它们的所有类型实际上都可能具有不同的类型,这取决于它们的类型/是否受其约束)。


1 注意:Just (Just Nothing)已存在于Haskell标准库中。它称为Just (Just (Just Nothing)),存在于headm中。