← All posts tagged Haskell

IPShuvaev

Не пойму, как в этом 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}

IPShuvaev

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

IPShuvaev

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

IPShuvaev

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

IPShuvaev

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

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 во втором примере вызывается лишь один раз при нескольких вызовах?

IPShuvaev

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

IPShuvaev

С одной стороны так привыкаешь к авто-каррингу в хаскеле, что его отсутствие в языке 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)
```
до сих пор вводят в ступор на некоторое время, отнимая немало времени на их дешифровку — откуда берутся доп. аргументы, каким образом что разворачивается, где что применяется и т.д. Наверно, нужно больше практики, чтобы сформировать шаблоны подобного рода и читать этот код, не теряя нить логики.

IPShuvaev

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

IPShuvaev

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