← All posts tagged Haskell

Не пойму, как в этом friday получить изображение из ByteString/Vector/Ptr. Базовое представление изображения — тип
data Manifest p = Manifest {manifestSize :: !Size, manifestVector :: !(Vector p)}
Что если скастовать Manifest Word8 к Manifest RGBPixel, где
data RGBPixel = RGBPixel {rgbRed :: !Word8, rgbGreen :: !Word8, rgbBlue :: !Word8}

Есть Ptr a, из которого я хочу получить ByteSstring, который потом соберется сборщиком мусора. Верно ли, что мне достаточно для этого воспользоваться функцией unsafePackMallocCString и не беспокоиться о ручном освобождении памяти? Как-то так?
mkStr f len = allocaBytes len \p -> unsafePackMallocCString (p, len)

После безуспешных попыток захвата изображения с веб-камеры на джаве, сделал это на хаскеле. Оказалось быстрее пофиксить проблему в хэкедж пакете, чем заставить работать jmf. Странно это.

Чем мне нравится java, так это тем, что не нужно дополнительно устанавливать сторонние библиотеки. Все, что требуется (dll, so, etc) уже включено в библиотеку. У хаскелла постоянно приходиться возиться с установкой сишных либ. Все дело в лицензиях?

Допустим, есть код типа

let go = do {s <- getLine; if True then return () else putStrLn s}

Очевидно, при каждом вызове go необходим ввод пользователя, хотя в дальнейшем он и не используется. Хочется отложить выполнение getLine до того момента, как реально потребуется значение s. Попытка использовать unsafePerformIO привела к неожиданному для меня результату:

:m System.IO.Unsafe
let go = let s = unsafePerformIO getLine in if False then return () else putStrLn s
go
1
1
go1

Вопрос, как быть в первом случае и почему getLine во втором примере вызывается лишь один раз при нескольких вызовах?

Благородные доны, поясните, как можно использовать функции модуля Data.Vector.Generic для мутабельного вектора из Data.Vector.Mutable?
Например, у меня есть вектор типа
(Data.Vector.Mutable.MVector RealWorld Double). Мне нужно применить к этому вектору функцию Data.Vector.Generic.all. Каким образом это сделать?

С одной стороны так привыкаешь к авто-каррингу в хаскеле, что его отсутствие в языке L считаешь упущением. map (+1) — любо-дорого посмотреть. С другой стороны, функции вида
```
delay :: a -> Signal a -> SignalGen (Signal a)
delay x0 s t_start t_sample | t_start < t_sample = s (t_sample-1)
```
до сих пор вводят в ступор на некоторое время, отнимая немало времени на их дешифровку — откуда берутся доп. аргументы, каким образом что разворачивается, где что применяется и т.д. Наверно, нужно больше практики, чтобы сформировать шаблоны подобного рода и читать этот код, не теряя нить логики.

Написал параллельную сортировку Шелла с использованием мутабельного массива. Миллион случайных чисел сортируется долгих 6 секунд. Стандартная функция Data.List.sort на этих же данных отрабатывает за 5 сек. Понятно, что Data.List.sort работает с небыстрым списком и скорости ждать не стоит.
Однако, сложность параллельной сортировки Шелла похожа на n log n, поэтому подозрение, что текущий вариант можно здорово ускорить. Непонятно лишь, как. Для сравнения, стандартная сортировка в java обрабатывает 10 млн чисел за 2 сек.
Код программы — lpaste.net

Как работать в Scotty с куками? Из коробки он в них не умеет. В пакете scotty-cookie функция setSimpleCookie перезаписывает предыдущую куку. Пакет cookie неудобен. Писать хедер руками не хочется