List 如何在Haskell中具有特定长度的列表中选择列表?
在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
[[["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
操作列表
但我认为这无论如何都不是正确的方法。要从列表中选择,应使用notmap
:
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
操作列表
但我认为这无论如何都不是正确的方法。要从列表中选择,应使用notmap
:
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
的人的列表。