2011-11-25 38 views
7

我还在努力破解这个代码:在Haskell中,为什么我必须在这段代码中使用美元符号?

import Data.Char 
groupsOf _ [] = [] 
groupsOf n xs = 
    take n xs : groupsOf n (tail xs) 

problem_8 x = maximum . map product . groupsOf 5 $ x 
main = do t <- readFile "p8.log" 
     let digits = map digitToInt $concat $ lines t 
     print $ problem_8 digits 

problem_8 x = maximum . map product . groupsOf 5 $ x 为什么不能把它仅仅是groupsOf 5×? 是因为x后来会扩展到其他一些表达式(这里是:digits = map digitToInt $concat $ lines t)?这就是所谓的懒惰(x现在不会扩大,但也许以后)?

回答

15

没有$,优先级作品出这样的:

maximum . map product . (groupsOf 5 x) 

.由于(功能组合物)采用两个函数作为参数,并groupsOf 5 x不能返回的函数,这是一个错误。

随着$,优先级作品出这样的:

(maximum . map product . groupsOf 5) x 

这相当于(通过功能的组合物)到:

maximum (map product (groupsOf 5 x)) 

或:

maximum $ map product $ groupsOf 5 x 

(但是沿着$这样被认为是不好的风格)

这与懒惰无关,请注意。

+0

谢谢。你是什​​么意思:既然。 (函数组合)以两个函数作为参数,?在“groupsOf 5”中,5被认为是一个函数? – osager

+0

无论如何,非常适合指出点预期的功能,而不是列表或任何数据类型的东西。 – osager

+0

不,'(groupsOf 5)'是一个函数 – bdonlan

5

正如bdonlan所说,$function application.functional composition

使用hoogle来搞清楚某些关键字正在做什么。它也可能有助于显示函数签名和模块名称。

+0

“功能应用程序”使其听起来很花哨......它实际上只是专用于函数类型的身份函数。 – Prateek

8

你不使用$,事实上,你永远必须使用它。

在你的情况下,毫无意义的^ H^H^H^Hsfree符号暗示自己:与其

problem_8 x = maximum . map product . groupsOf 5 $ x 

这相当于:

problem_8 x = (maximum . map product . groupsOf 5) x 

我们可以离开了x上方程两边:

problem_8 = maximum . map product . groupsOf 5 
+1

耶,eta减少!强烈建议[hlint](http://hackage.haskell.org/package/hlint)提供此类建议。 –

+0

有几种情况下使用'$'是唯一的方法来做某件事情,比如当你将它传递给一个更高阶的函数时。 –

相关问题