gpt4 book ai didi

list - Haskell 列表中的列表

转载 作者:行者123 更新时间:2023-12-02 08:07:51 25 4
gpt4 key购买 nike

我是 Haskell 的新手,我正在尝试以下操作:要从 [[1,2,3],[4,5,6]] 获取 [1,2,3]

example :: [[a]] -> [a]
example [] = []
example [x:xs] = [x]

当输入为 [[1,2,3]] 并且如果我在主列表中添加其他元素时,此示例将返回 [1],例如 [[1,2,3],[3,4,5]] 然后我有一个非穷举模式函数。

最佳答案

你很接近。事实上,您在这里想要的是某种“安全”的头。

列表[a]有两个构造函数:

  1. 空列表[],你在第一种情况下覆盖了它;和
  2. “缺点”(x:xs)

看起来您在第二种情况下涵盖了这一点,但实际上您没有:您将模式放在 括号内。因此,Haskell 将您的模式解释为 [(x:xs)]。所以它认为你匹配了一个 singleton 列表(一个只有一个元素的列表),而 x 是子列表的头部,而 xs子列表的尾部。

事实上你想覆盖(x:xs)。如果我们使用这个模式,还有另一个问题:x 是列表的头部,所以它的类型是 [a]。因此我们应该返回 x,而不是 [x],因为在后一种情况下,我们会将子列表包装回列表中。

所以正确的函数是:

example :: [[a]] -> [a]
example [] = []
example <b>(</b>x:_<b>)</b> = <b>x</b> -- round brackets, x instead of [x]

请注意,由于我们对此处的尾部不感兴趣,因此我们使用下划线 _。如果您编译时带有所有警告(-Wall,或更具体的 -Wunused-matches),否则 Haskell 会提示您声明了一个您不使用的变量。

泛化为 safeHead 函数

我们可以将其概括为某种通用的 safeHead::b -> (a -> b) -> [a] -> b 函数:

safeHead :: b -> (a -> b) -> [a] -> b
safeHead d _ [] = d
safeHead _ f (x:_) = f x

因此,我们在这里将三个参数传递给 safeHead:一个值(b 类型)我们应该在列表为空的情况下返回;对头部进行后处理的函数(键入 a -> b),以及要处理 的列表。在这种情况下,示例 等同于:

example :: [[a]] -> [a]
example = safeHead [] id

但我们也可以在这里返回一个Maybe [a]:

example2 :: [a] -> Maybe a
example2 = safeHead Nothing Just

关于list - Haskell 列表中的列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49794097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com