我仍在尝试破解此代码:
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
为什么它不能只是5 x的组?
是因为x以后会扩展到其他一些表达式(这里它将是:digits = map digitToInt $concat $ lines t
)?这就是所谓的懒惰(x现在不会扩展,但可能稍后扩展)?
答案 0 :(得分: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
(但是像这样沿$
穿线被认为是不好的风格)
这与懒惰无关,请注意。
答案 1 :(得分:9)
您
在你的情况下,毫无意义的^ H ^ H ^ H ^ Hsfree符号表明自己:而不是
$
相当于:
problem_8 x = maximum . map product . groupsOf 5 $ x
我们可以忽略等式两边的problem_8 x = (maximum . map product . groupsOf 5) x
:
x
答案 2 :(得分:5)
正如bdonlan所说,$
是function application而.
是functional composition。
使用hoogle来确定某些关键字正在做什么。它也可能有助于显示函数签名和模块名称。