Telegram Group & Telegram Channel
# 🧠 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.



tg-me.com/haskell_tg/36
Create:
Last Update:

# 🧠 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.

BY Haskell


Warning: Undefined variable $i in /var/www/tg-me/post.php on line 283

Share with your friend now:
tg-me.com/haskell_tg/36

View MORE
Open in Telegram


Haskell Telegram | DID YOU KNOW?

Date: |

That strategy is the acquisition of a value-priced company by a growth company. Using the growth company's higher-priced stock for the acquisition can produce outsized revenue and earnings growth. Even better is the use of cash, particularly in a growth period when financial aggressiveness is accepted and even positively viewed.he key public rationale behind this strategy is synergy - the 1+1=3 view. In many cases, synergy does occur and is valuable. However, in other cases, particularly as the strategy gains popularity, it doesn't. Joining two different organizations, workforces and cultures is a challenge. Simply putting two separate organizations together necessarily creates disruptions and conflicts that can undermine both operations.

In many cases, the content resembled that of the marketplaces found on the dark web, a group of hidden websites that are popular among hackers and accessed using specific anonymising software.“We have recently been witnessing a 100 per cent-plus rise in Telegram usage by cybercriminals,” said Tal Samra, cyber threat analyst at Cyberint.The rise in nefarious activity comes as users flocked to the encrypted chat app earlier this year after changes to the privacy policy of Facebook-owned rival WhatsApp prompted many to seek out alternatives.Haskell from tr


Telegram Haskell
FROM USA