2016-12-01 3 views
0

私はこのようになりますリストがあります:Haskellで特定の長さのリスト内でリストを選択するにはどうすればよいですか? 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 

(印刷は一例であり、私は後でそれらと連携する必要があります)

しかし、これは

Couldn」を返します実際のタイプ「IO()」で予想されるタイプ「IO()」と一致する

行5のエラーです。

どのようにすればいいですか?

おかげ

+5

Ick。 'data Person = Person {name :: String、address :: Maybe String}'のような実数型を使用してください。 –

+0

どうやって使用しますか?また、アドレスのないデータの人を捨てたいので、無駄な情報を保存しないのでしょうか?そして、私はまだ私のプログラムでそれがさらに必要なときに、誰が住所を持っていて誰が誰でないかを確認する必要があります。 – BourbonCreams

+2

BourbonCreams、@DanielWagnerは、あなたが人をそのようなリストとして表現している状況になることを避けることを示唆している可能性があります。それは唯一の痛みを引き起こすつもりです。 – dfeuer

答えて

3

あなたの問題はprintIO行動であり、これらの配列を決定するためにあなたもIO()mainことを期待を取り戻すためにmapM_の代わりmapを使用する必要があるだろうということです。あるいは、sequence_の呼び出しでが生成したアクションIOのリストをラップします。

しかし、これはとにかく正しいアプローチだとは思わない。リストから選択するには、あなたがfilterないmapを使用する必要があります。

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

main :: IO() 
main = print myLen2List 

言った、@Danielワグナーは、コメントでは全く正しいです。カスタムデータ型としてリストを使用しないでください。

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 
+0

あなたは正しいです、私は最初にフィルターについて考えていたはずです。ありがとうございました。 (mapM_はそれでも動作します) – BourbonCreams

+1

さらに、私は 'personWithAddress'型も持っていて、' mapMaybe'を使ってそれらのリストを生成するのが良いと思います。 – dfeuer

関連する問題