2011-08-26 50 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实际上不是一个理想的解决方案)* –