@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 , но почему так происходит,я не понимаю.
  • Вопрос задан
  • 165 просмотров
Решения вопроса 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. Поэтому последний пример эквивалентен исходному и скобки не обязательны. Правда, советуют ставить пробелы вокруг точки (оператора композиции) для наглядности.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы