繁体   English   中英

Haskell列表中的列表

[英]Haskell Lists in List

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

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

当输入为[[1,2,3]]且如果我在主列表中添加另一个元素,例如[[1,2,3],[3,4,5]]时,此示例返回[1]我有一个非穷尽模式功能。

你很亲密 实际上,您在这里想要的是某种“安全”的头。

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

  1. 空列表[] ,您将在第一种情况下解决此问题;
  2. “ cons” (x:xs)

在第二种情况下,您似乎已将其覆盖,但实际上您没有:将图案放在括号中。 结果,Haskell将您的模式解释为[(x:xs)] 因此,它认为您匹配一个单例列表(一个具有一个元素的列表),并且x是子列表的开头,而xs是子列表的结尾。

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

因此正确的功能是:

example :: [[a]] -> [a]
example [] = []
example (x:_) = x  -- 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 )以及要process的列表。 在这种情况下,该example等效于:

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

但是我们也可以在这里返回Maybe [a]

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM