2017-03-16 3 views
3

私はハスケルを新しくしています。だれかが私を助けてくれるのだろうかと思っていました。タイプリストからタイプを削除するhaskell

私はそうのようなカスタムデータ型のリストを持っている:

type Title = String 
type Manager = String 
type Year = Int 
type Fan = String 
type Album = (Title, Manager, Year, [Fan]) 

そして、私はアルバム

albumDatabase :: [Album] 
albumDatabase = [(...)] 

の既製の静的なデータベースを持っていると私は返す関数を持っていますマネージャーが作成したすべてのアルバム:

manAlbum :: String -> [Album] -> [Album] 
manAlbum d database = filter ((\(_,album,_,_) -> d == album)) database 

私の質問は、すべてのマネージャーアルバムのこの新しいリストから、私は必要ですファンのみを取得し、タイトル、マネージャー、年を削除します。しかし、私はカスタムデータ型のこのフィールドを返すだけであることをhaskellに伝える方法は不明です。

+1

実際の質問ではありませんが、マップを使用して[アルバム] - [[ファン]] ' – 4castle

+0

ありがとう、私の質問を更新 –

答えて

2

4castleが述べたように、あなたはmapを使用することができます。

getAlbumFans :: [Album] -> [[Fan]] 
getAlbumFans database = map (\(_,_,_,fans) -> fans) database 

また、あなたはそれをgetAlbumsByManagerのようなより説明的な名前を与え、Managerと型シグネチャにStringを置き換えることにより、manAlbum機能を読みやすくすることができます。

+0

ああ私はそれが素晴らしい作品を参照してください、ありがとう –

0

Albumを代数データ型にすることもできます。次のように書き直すと、コードを理解しやすくなると思います。

type Title = String 
type Manager = String 
type Year = Int 
type Fan = String 
data Album = Album { title :: Title, manager :: Manager, year :: Year, fans :: [Fan]} deriving (Show) 

albumDatabase :: [Album] 
albumDatabase = [Album {title="A", manager="B", year=5, fans=["a","b"]}] 

check :: Album -> String -> Bool 
check a d=title a==d 

manAlbum :: String -> [Album] -> [[Fan]] 
manAlbum d database = map (\a->fans a) $ filter (\a->title a==d) database 
関連する問題