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

McB*_*den 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
Run Code Online (Sandbox Code Playgroud)

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

bdo*_*lan 15

如果没有$,优先顺序如下:

maximum . map product . (groupsOf 5 x)
Run Code Online (Sandbox Code Playgroud)

由于.(函数组合)将两个函数作为参数,并且groupsOf 5 x不能返回函数,因此这是一个错误.

有了$,优先顺序就像这样:

(maximum . map product . groupsOf 5) x
Run Code Online (Sandbox Code Playgroud)

这相当于(通过函数组合):

maximum (map product (groupsOf 5 x))
Run Code Online (Sandbox Code Playgroud)

要么:

maximum $ map product $ groupsOf 5 x
Run Code Online (Sandbox Code Playgroud)

(但是$像这样穿线被认为是不好的风格)

注意,这与懒惰无关.


Ing*_*ngo 9

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

在你的情况下,毫无意义的^ H ^ H ^ H ^ Hsfree符号表明自己:而不是

problem_8 x = maximum . map product . groupsOf 5 $ x
Run Code Online (Sandbox Code Playgroud)

这相当于:

problem_8 x = (maximum . map product . groupsOf 5) x
Run Code Online (Sandbox Code Playgroud)

我们可以忽略x等式的两边:

problem_8 = maximum . map product . groupsOf 5
Run Code Online (Sandbox Code Playgroud)


ДМИ*_*КОВ 5

正如一个bdonlan所说,$是一个功能应用程序并且.功能组合.

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