簡體   English   中英

如何使用多個參數映射haskell中的函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM