TGViewer
Haskell Haskell @haskell_tg · 586 subscribers
Post #36 1.55K
# 🧠 Haskell-задача с подвохом: “print vs lazy evaluation”

📘 Условие

Посмотри на следующий код:


main :: IO ()
main = do
let xs = [1..5]
print (map (\x -> traceShow x (x * 2)) xs)


❓ Вопрос:

1) Что напечатает эта программа?
2) Почему traceShow не ведёт себя так, как ожидается?
3) Как заставить traceShow сработать для каждого элемента?

---

✅ Подвох: ленивость вычислений

Haskell по умолчанию не выполняет вычисления, если результат не используется.

map просто создаёт ленивое представление списка.
print вызывает show, но show на списках вызывает show только на нужных элементах при необходимости.

В результате, traceShow может сработать один раз или вообще не выполниться, если не происходит полного прохода по списку.

---

✅ Пример вывода:


1
[2,4,6,8,10]


Хоть в map был traceShow, только первый элемент срабатывает (или вообще никто — в зависимости от версии).

---

✅ Правильный способ — форсировать вычисление:

```haskell
import Debug.Trace
import Control.DeepSeq

main :: IO ()
main = do
let xs = [1..5]
let ys = map (\x -> traceShow x (x * 2)) xs
ys `deepseq` print ys
```

Теперь `traceShow` сработает **для каждого элемента**, потому что `deepseq` заставит Haskell **полностью вычислить список** перед `print`.

---

⚠️ Подвох

• `map` не вызывает функцию сразу — только когда элемент реально нужен
• `print` может не форсировать весь список
• Это вызывает недоумение у тех, кто ожидает «ленивость только в `IO`»

🎯 Отличная задача, чтобы проверить знание ленивости и управления побочными эффектами в Haskell.
  • 👍 4
  • ❤ 2
  • 🔥 2
More from @haskell_tg
  1. Oct 30, 2025📊 TypeScript впервые обошёл Python и JavaScript в рейтинге GitHub Octoverse 2025 GitHub о…
  2. Aug 11, 2025📌Новый прорыв в алгоритмах: найден способ считать кратчайшие пути быстрее Дейкстры Метод…
  3. Jun 27, 2025🧠 Топ языков от евангелиста функционального программирования Один из известных проповедни…
  4. Apr 21, 2025⚡️ Перенос рекомендаций песен на Haskell В статье рассказывается о переводе кода на F# в H…
  5. Mar 24, 2025⚡️ Google представил OSV-Scanner v2 Новая версия OSV-Scanner значительно расширяет возможн…
  6. Feb 16, 2025«Large Lambda Model» крутой гайд, где автор делится опытом реализации инференса модели GPT…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →