如何在列表中选择Haskell中具有特定长度的列表?

时间:2016-12-01 01:24:30

标签: list haskell if-statement functional-programming

在Haskell中,我有一个如下所示的列表:

[[["PersonA"],["AddressA"]],[["PersonB"],["AddressB"]],[["PersonC"]]]

我需要列表中长度为2的列表,即我知道地址的人。在这种情况下,我想要:

[["PersonA"],["Address"]]

and

[["PersonB"],["Address"]]

我不想要PersonC,因为我没有他的地址。

我在考虑类似的事情:

myList = [[["PersonA"],["123456789"]],[["PersonC"],["987654321"]],[["PersonE"]]]

main :: IO ()
main = do
  map (\x -> if length x == 2 print x else print "") myList

(打印只是一个例子,我稍后需要与他们合作)

但是这会返回一个

  

无法将预期类型'IO()'与实际类型'[IO()]'

匹配
第5行出现

错误。

知道怎么做吗?

由于

1 个答案:

答案 0 :(得分:3)

您的问题是print是一个IO操作,要对这些操作进行排序,您需要使用mapM_代替map来取回IO () 1}} main期望。或者,打包IOsequence_来电中生成的map行为列表。

但我不认为这是正确的方法。要从列表中进行选择,您应使用filter而不是map

myList = [[["PersonA"],["123456789"]],[["PersonC"],["987654321"]],[["PersonE"]]]
myLen2List = filter (\x -> length x == 2) myList

main :: IO ()
main = print myLen2List

那就是说,@丹尼尔瓦格纳在评论中是完全正确的。不要将列表用作自定义数据类型。

data Person = Person { name :: String, address :: Maybe String } deriving (Eq, Show)
myList = [ Person "PersonA" (Just "123456789"),
           Person "PersonC" (Just "987654321"),
           Person "PersonE" Nothing ]

myAddressList = filter (isJust . address) myList

main = print myAddressList