[英]How to map a function in haskell with more than one parameter
我有這個功能:
aantalSong song list = let lijst = filterSong song list
in teller lijst
filterSong song list = filter (==song) list
teller lijst = length lijst
我想做這樣的事情:
aantalSongs song list revs = map (aantalSong song list) revs
如果我是對的那不可能做到這一點,但最好的替代方案是什么?
aantalSong
實際上只計算特定歌曲在歌曲列表中出現的次數。 假設revs
類似於Review
的列表(對於未來的讀者,請參閱上一個問題: 過濾一個haskell列表 ),那么你需要將“song list getter”與aantalSong
一起aantalSong
。
aantalSongs song revs = map (\rev -> aantalSong song (topSongs rev)) revs
我們可以做很多技巧來壓縮這些代碼,也許可以讓它更清晰。 首先是一些eta減少和運動到組成風格。
aantalSongs song revs = map (\rev -> aantalSong song (topSongs rev)) revs
aantalSongs song = map (\rev -> aantalSong song (topSongs rev))
aantalSongs song = map (aantalSong song . topSongs)
然后我們打開aantalSong
,看看我們是否可以進一步簡化它。 這基本上只是很多函數內聯。
aantalSong song list = let lijst = filterSong song list in teller lijst
aantalSong song list = let lijst = filterSong song list in length lijst
aantalSong song list = length (filterSong song list)
aantalSong song = length . filterSong song
aantalSong song = length . filter (== song)
組合這些部分為我們提供了一種相對簡單的功能。
-- | The number of times a particular song is
-- given as the 'topSong' in each review.
aantalSongs :: String -> [Review] -> [Int]
aantalSongs song = map (length . filter (== song) . topSongs)
在我自己的代碼中,我通常會把它寫成公正的
-- | The number of times a particular song is
-- given as the 'topSong' in a review.
aantalSongs :: String -> Review -> Int
aantalSongs song = length . filter (== song) . topSongs
並在需要時map
Review
列表。
有些人認為無點樣式是混淆和“毫無意義”,但是如果使用得當,我認為這樣可以使代碼看起來非常精彩。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.