Haskell
558 subscribers
25 photos
1 video
1 file
24 links
Язык программирования Haskell

по всем вопросам - @haarrp

https://t.me/+GLeZfukB0IwxM2Ji - ссылка на канал для друга
Download Telegram
⚡️ winasyncsocket: Truly asynchronous socket I/O on Windows

По-настоящему асинхронный TCP/IP на Haskell/Windows!

🖥 Github

@haskell_tg
Please open Telegram to view this post
VIEW IN TELEGRAM
«Large Lambda Model» крутой гайд, где автор делится опытом реализации инференса модели GPT-2 на языке Haskell с использованием библиотеки hmatrix и OpenBLAS.

Основная цель проекта — выполнить прямой проход (forward pass) модели без обучения или обратного распространения ошибки.

Этот проект демонстрирует, как можно реализовать инференс модели GPT-2 на Haskell, углубляясь в детали архитектуры и работы с линейной алгеброй без использования специализированных тензорных библиотек.

Выбор инструментов:
Haskell и hmatrix: Использование Haskell с hmatrix для линейной алгебры.
OpenBLAS: Применение для оптимизации линейных операций.
Архитектура GPT-2:


Ресурсы для изучения:
- Репозитории Karpathy: NanoGPT и llm.c.
Визуализатор LLM от Brendan Bycroft.
Веб-приложение для токенизации: tiktokenizer.

Читать

@haskell_tg
⚡️ Google представил OSV-Scanner v2

Новая версия OSV-Scanner значительно расширяет возможности для разработчиков:

• Теперь сканируются проекты на .NET, Python, Java, JS, Go, Haskell — включая такие форматы, как deps.json, uv.lock, bun.lock, Uber Jars и др.

• Сводка по уязвимостям с фильтрами по критичности, пакетам, слоям в виде интерактивного HTML-отчёта

• Если вы используете Java с Maven, инструмент подскажет, как безопасно обновить уязвимые зависимости с минимальными рисками.

• Анализ образов Debian, Ubuntu и Alpine с определением уязвимых пакетов, историей слоев, идентификацией базового образа и фильтрацией ложных срабатываний

📌 Релиз
⚡️ Перенос рекомендаций песен на Haskell

В статье рассказывается о переводе кода на F# в Haskell для задачи рекомендаций песен. Это часть серии о работе с разными языками программирования и функциональной архитектурой.

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