函数组成时函数参数的顺序错误

时间:2011-08-26 16:44:22

标签: haskell

我理解在Haskell中,最重要的是将最“变量”的参数(也就是输入对象)放在函数定义的最后,以使函数尽可能可组合(reference)。但是,如果我使用的库函数不遵循此规则,那么函数组合是否有任何替代/解决方法来提高可读性?

我将给出一个具体的例子 - subRegex函数将输入字符串作为两个参数中的第一个,因此链接其中两个加上toUpper以创建“slugify”函数I最终得到了以下内容:

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

考虑到subRegex参数的顺序,是否有一种函数组合式的方式来整理它?

1 个答案:

答案 0 :(得分: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的重复呼叫。