从" fold"的简单案例开始(我用(+)但可以是其他任何东西):
Prelude.foldl (+) 0 [10,20,30]
是否可以应用类似于(不起作用)的内联转换:
Prelude.foldl ((+) . (\x -> read x :: Int)) 0 ["10","20","30"]
如果没有,是否有替代折叠,应用泛型函数和内联转换(除了使用特定函数,如&#39; sum&#39;,&#39; max&#39;等)?< / p>
答案 0 :(得分:4)
read
lambda适用于第一个参数,而赋给foldl
的函数的第一个参数是累加器。这两个论点与foldr
相反。所以,扩展,它看起来像这样:
foldl (\acc element -> (read acc :: Int) + element) 0 ["10", "20", "30"]
由于acc
是Int
,因此无效。
因此,有了这些信息,您可以使用foldr
执行此操作,因为它具有相反的参数顺序:
foldr ((+) . (read :: String -> Int)) 0 ["10","20","30"]
如果您需要内联foldl
版本,可以使用flip
来实现此目的。
您也可以先使用map
(其他条件相同,这将是我更喜欢的解决方案):
foldl (+) 0 $ map (read :: String -> Int) ["10","20","30"]