@trapce

Как работает композиция в Haskell?

Пожалуйста, объясните как работает вот эта функция:
import Data.Char
digitSum :: Int -> Int
digitSum = sum.map digitToInt.show

как так получается, что функция show преобразовывает число в строку и при этом отдает не в функцию digitToInt, а в функцию map и сама в качестве первого аргумента ставится у map.
По логике вещей show должна передать в digitToInt исходя из (.) :: (b -> c) -> (a -> b) -> a -> c, но проход как-то перехватывается мапой

digitToInt :: Char -> Int

вернее можно сделать так digitSum = sum.(map digitToInt).show , но почему так происходит,я не понимаю.
  • Вопрос задан
  • 163 просмотра
Решения вопроса 1
@AlexSku
не буду отвечать из-за модератора
1) y = show x
где х - число. Результат y - строка
2) z = map digitToInt y
digitToInt переводит все символы (разряды исходного числа x в числа). Результат z - список чисел.
Т.е. x = 125, y = "125" или ['1', '2', '5'], z = [1, 2, 5]
3) sum z считает сумму списка, в нашем случае сумму цифр исходного многоразрядного числа.

Ответ на последний вопрос такой. У функции самый большой приоритет (10), поэтому map "притягивает" аргумент digitToInt. У ОПЕРАТОРА композиции приоритет, вроде, 9. Поэтому последний пример эквивалентен исходному и скобки не обязательны. Правда, советуют ставить пробелы вокруг точки (оператора композиции) для наглядности.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы