在Haskell中,为什么我必须在此代码中使用美元符号?

时间:2011-11-25 23:20:47

标签: 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 为什么它不能只是5 x的组? 是因为x以后会扩展到其他一些表达式(这里它将是:digits = map digitToInt $concat $ lines t)?这就是所谓的懒惰(x现在不会扩展,但可能稍后扩展)?

3 个答案:

答案 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来确定某些关键字正在做什么。它也可能有助于显示函数签名和模块名称。