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

List 如何在Haskell中具有特定长度的列表中选择列表?,list,haskell,if-statement,functional-programming,List,Haskell,If Statement,Functional Programming,在Haskell中,我有一个如下列表: [[["PersonA"],["AddressA"]],[["PersonB"],["AddressB"]],[["PersonC"]]] 我需要列表中长度为2的列表,即我知道地址的人。在这种情况下,我希望: [["PersonA"],["Address"]] and [["PersonB"],["Address"]] 我不想要PersonC因为我没有他的地址 我在想这样的事情: myList = [[["PersonA"],["123456789

在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行出错

你知道怎么做吗


谢谢

您的问题是,
print
是一个
IO
操作,要对这些操作进行排序,您需要使用而不是
map
来获取
main
所期望的
IO()
。或者,包装调用中生成的
IO
操作列表

但我认为这无论如何都不是正确的方法。要从列表中选择,应使用not
map

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

main :: IO ()
main = print myLen2List

也就是说,@Daniel Wagner的评论完全正确。不要将列表用作自定义数据类型

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

您的问题是,
print
是一个
IO
操作,要对这些操作进行排序,您需要使用而不是
map
来获取
main
所期望的
IO()
。或者,包装调用中生成的
IO
操作列表

但我认为这无论如何都不是正确的方法。要从列表中选择,应使用not
map

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

main :: IO ()
main = print myLen2List

也就是说,@Daniel Wagner的评论完全正确。不要将列表用作自定义数据类型

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

哎呀。使用实类型,如
data Person=Person{name::String,address::Maybe String}
。您将如何使用它?另外,由于我想丢弃没有地址的人的数据,它不会存储无用的信息吗?当我在我的程序中进一步需要它时,我仍然需要检查谁有地址,谁没有地址。BourbonCreams,@DanielWagner可能建议你避免陷入这样一种情况,即你将一个人作为列表来代表。这只会让你痛苦。好吧,我明白你的意思。谢谢你。使用实类型,如
data Person=Person{name::String,address::Maybe String}
。您将如何使用它?另外,由于我想丢弃没有地址的人的数据,它不会存储无用的信息吗?当我在我的程序中进一步需要它时,我仍然需要检查谁有地址,谁没有地址。BourbonCreams,@DanielWagner可能建议你避免陷入这样一种情况,即你将一个人作为列表来代表。这只会让你痛苦。好吧,我明白你的意思。谢谢你说得对,我应该先考虑一下过滤器。谢谢你。(mapM_u使它也能工作)更好的是,我认为,如果有一个
的personWithAddress
类型,并生成一个使用
mappaye
的人的列表。你是对的,我应该首先考虑过滤器。谢谢你。(mapM_u使它也起作用)我认为,更好的做法是让一个
personWithAddress
类型,并生成一个使用
mappaye
的人的列表。