在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。
我的问题是这令人困惑,因为对于空列表,如果列表的头都没有,我会得到相同的结果。
这是一种好习惯吗,我应该检查列表是否为空吗?
答案 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
中。