В 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 ? это потому, что x позже будет расширен до некоторых других выражений(здесь это будет:digits = map digitToInt $concat $ lines t ) ? это так называемый ленивый (x не будет расширен сейчас, но, возможно, позже) ?

3 ответов


без $, приоритет работает следующим образом:

maximum . map product . (groupsOf 5 x)

С . (function composition) принимает две функции в качестве аргументов и groupsOf 5 x не удается вернуть функцию, это ошибка.

С $, приоритет работает следующим образом:

(maximum . map product . groupsOf 5) x

это эквивалентно (через функциональную композицию):

maximum (map product (groupsOf 5 x))

или:

maximum $ map product $ groupsOf 5 x

(однако дурачит $ как это считается плохим style)


не обязательно использовать $ в самом деле, вы никогда не обязательно использовать его.

в вашем случае бессмысленная^H^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

Как bdonlan сказал:$ Это прикладная функция и . is функциональный состав.

использовать hoogle чтобы выяснить, что делает какое-то ключевое слово. Это также может быть полезно для отображения подписи функции и имени модуля, откуда она.