2011-08-26 75 views
1

我知道在Haskell中,最重要的是在函數定義中放置最「變量」參數(又稱輸入對象),以使函數儘可能組合(reference)。但是,如果我使用的庫函數不遵循此規則,是否有任何替代方法/解決方法來使用組合來提高可讀性?當函數參數的順序錯誤時的函數組合

我會給出一個具體的例子 - subRegex函數將輸入字符串作爲第一個的兩個參數,所以鏈接兩個的這些加一個toUpper創建我已經結束了與下方的「slugify」功能:

slugify :: FilePath -> FilePath 
slugify old = 
    let (dir, file) = splitFileName old 
    in combine dir $ subRegex (mkRegex "[ _]") (subRegex (mkRegex "[^.a-z0-9_ ]+") (map toLower file) "") "-" 

是否有一個函數組合風格的方式來整理這給定的subRegex參數的順序?

+2

我不知道它會在這裏有多大幫助,但[pointfree](http://hackage.haskell.org/package/pointfree)工具有時可用於這些類型的東西。 –

回答

5

你總是可以提供一個小幫手來改變參數順序爲更可組合:

slugify :: FilePath -> FilePath 
slugify old = 
    let (dir, file) = splitFileName old 
    in combine dir $ sub "[ _]" "-" $ sub "[^.a-z0-9_ ]+" "" $ map toLower file 
    where 
    sub regex replacement input = subRegex (mkRegex regex) input replacement 

在簡單的情況下,也可以使用flip或lambda表達式,但在這種情況下,我覺得一個地方定義更好。它還可以很容易地刪除mkRegex的重複呼叫。

+3

'sub =翻轉。 subRegex。 mkRegex' – fuz

+1

@FUZxxl:過度無點式讓我的頭部受傷。 – hammar

+0

很明顯,這裏的理想解決方案是使用類型hackery for variadic [翻轉](https://github.com/isomorphism/typewriter/blob/master/Data/Typewriter/Variadic/Flip.hs)或[函數組合] (https://github.com/isomorphism/typewriter/blob/master/Data/Typewriter/Variadic/Compose.hs)*([1] - NB實際上不是一個理想的解決方案)* –