【问题标题】:Get first element of list as Maybe vs Maybe elements获取列表的第一个元素作为 Maybe vs Maybe 元素
【发布时间】:2019-05-29 15:25:39
【问题描述】:

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

假设我有函数返回列表的第一个元素,如果为空则返回 None。

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

所以现在我有一个函数可以从地图和键中获取所有值:

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

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

所以如果我在空列表上调用 headm,我会得到 None。

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

我的问题很令人困惑,因为我得到了空列表的相同结果,如果列表头没有。

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

【问题讨论】:

  • 谢谢,我编辑了标题希望现在更好

标签: functional-programming


【解决方案1】:

如果我对您的理解正确,那么您问题的前提实际上并不完全正确,因为当您将headm 应用于您描述的[None, Some(24)] 列表时,您将不会得到None .你会得到Some(None)

要使用 Haskell 示例使事情更具体,我们可以将 headm 定义为1

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

这是两个不同的值(这就是它们以不同方式打印的原因),它们彼此不相等。 Just (Just Nothing)Just (Just (Just Nothing)) 等值也存在并且彼此不同(实际上它们都可能具有不同的类型,具体取决于它们的类型如何/是否受到约束)。


1注意:headm 已经存在于 Haskell 标准库中。它被称为listToMaybe,存在于Data.Maybe

【讨论】:

  • 谢谢,我错了。事实上,它返回 Some(None)。但我想知道在某些情况下两者都返回相同的类型。以及为什么函数 headm 被称为 listToMaybe 因为它只返回第一个元素。
  • @user2693928 这种情况是完全不可能的,因为根据定义,空列表情况是唯一给你None的情况。非空列表将总是给你Some ...。之所以调用 listToMaybe,是因为它将列表转换为 Maybe,并且还有另一个名为 maybeToList 的函数朝着另一个方向发展。
猜你喜欢
  • 2021-01-03
  • 2019-04-19
  • 2016-12-31
  • 1970-01-01
  • 1970-01-01
  • 2021-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多