Язык Haskell: О пользе и вреде лени: различия между версиями

→‎Задача разложения числа на степени двойки: убраны лишние скобки (если это дидактически неверно, то пожалуйста верните их обратно).
(→‎Задача разложения числа на степени двойки: убраны лишние скобки (если это дидактически неверно, то пожалуйста верните их обратно).)
— первый способ:
 
<code>toPowers = (filter (/=0)) . (zipWith (*) powers) . toDigsI</code>
 
Функция <code>filter</code> получает на вход булеву функцию (функцию, возвращающую «правду» или «ложь») и список, а возвращает список только из тех элементов, на которых значение этой функции равно «правде». В данном случае мы оставляем только ненулевые элементы:
<code>toPowers (16 + 8 + 1) <math>\Rightarrow</math> [1, 8, 16]</code>.
 
Функция <code>zipWith</code> получает три аргумента. Если указано только два аргумента, то она превращается в функцию от одного аргумента. Это позволяет использовать выражение <code>(zipWith (*) powers)</code> как функцию от одного аргумента и поместить в цепочку композиции с функцией <code>toDigsI</code>. Аналогичная ситуация с функцией <code>filter</code>: мы задали для неё первый аргумент — <code>(/=0)</code> — это функция сравнения с нулём. Второй аргумент остался неопределённым. Он достанется ей по цепочке как значение
функции <code>(zipWith (*) powers)</code> на том, что вернёт ей функция <code>toDigsI</code>, применённая к тому, что даст пользователь в качестве аргумента функции <code>toPowers</code>.
 
Точки в определении функции <code>toPowers</code> играют роль операции «|» (pipe) в стандартной оболочке Linux. С помощью этой операции происходит передача результатов вычисления одной функции на вход другой. В нашем случае была выстроена цепочка из трёх функций.
18

правок