应用内联函数的转换

时间:2015-06-22 17:37:27

标签: haskell

从" fold"的简单案例开始(我用(+)但可以是其他任何东西):

Prelude.foldl (+) 0 [10,20,30]

是否可以应用类似于(不起作用)的内联转换:

Prelude.foldl ((+) . (\x -> read x :: Int)) 0 ["10","20","30"]

如果没有,是否有替代折叠,应用泛型函数和内联转换(除了使用特定函数,如&#39; sum&#39;,&#39; max&#39;等)?< / p>

1 个答案:

答案 0 :(得分:4)

read lambda适用于第一个参数,而赋给foldl的函数的第一个参数是累加器。这两个论点与foldr相反。所以,扩展,它看起来像这样:

foldl (\acc element -> (read acc :: Int) + element) 0 ["10", "20", "30"]

由于accInt,因此无效。

因此,有了这些信息,您可以使用foldr执行此操作,因为它具有相反的参数顺序:

foldr ((+) . (read :: String -> Int)) 0 ["10","20","30"]

如果您需要内联foldl版本,可以使用flip来实现此目的。

您也可以先使用map(其他条件相同,这将是我更喜欢的解决方案):

foldl (+) 0 $ map (read :: String -> Int) ["10","20","30"]

另外,you probably want foldl' instead of foldl