В 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 чтобы выяснить, что делает какое-то ключевое слово. Это также может быть полезно для отображения подписи функции и имени модуля, откуда она.