Alex
Джентельмены
Alex
У меня следующий вопрос
Alex
есть функция которая возвращает IO Bool
Alex
Как это использовать в if?
Alexander
do b <- функция
if b
Alex
Гениально
Alex
Спасибо еще раз
Alexander
есть пакет с кучей примитивов, который это делает
Alexander
не помню как называется
Alex
Я видел ifM
Alexander
ещё можно bool one another =<< функция
Alex
но мне показался он слишком сложным для повседневного использования
Alexander
я такими не пользуюсь
Tom
Всем привет.
Мне тут Monte Carlo крутить надо, и основной прогон написан на C++ с C оберткой. Этот прогон написан умышленно без параллелизации, потому как я подумал, что я из Haskell из нескольких потоков эти функции повызываю, и будет мне счастье. А вот что-то мне неочевидно, как это лучше воплотить. Просто нужно генерирование рандомных чисел. Каждому ОС потоку бы свой генератор иметь, а как это в Haskell воспроизвести? Если я в С генераторы thread local сделаю, а потом в Haskell несколько потоков с forkOS запущу, оно будет работать? Или я упустил чего? Советы очень приветствуются.
Kirill
forkOS лучше ненадо
Tom
Alexander
forkOS + несколько tls генераторов сработают конечно
Alexander
но нужно помнить, что одновременно будут выполняться только N, где N это то что в +RTS -N передано
Alexander
поэтому лучше запустить сишный вызов, он там сам форкнется и вернёт структуру для управления
Alexander
тогда сишные методы могут работать с своих потоках независимо от RTS, с TLS и всеми делами
Alexander
тогда только о том, как сказать RTS что все готово останется подумать
Kirill
плюс forkOS накладные расходы увеличит, т.к. по сути это ещё ртс на каждый поток
Alexander
Kirill не обманывай человека, пожалуйста
Kirill
почему?
Alexander
потому что forkOS это создание posix-треда на каждый вызов forkOS
Alexander
это не forkProcess
Tom
Alexander
можно и так
Kirill
блин, точно forkProcess же
Alexander
я не знаю как там у тебя внутри все сделано, и хочется ли в функции делать p_thread_create ... pthread_join
Alexander
но в summary: forkOS + lts - будет работать, но будет зависеть от RTS и параллельность лимитирована настройками haskell RTS
Alexander
forkOS + pthread_create внутри функции - будет работать, можно отцепить от RTS совсем, но нужно будет с нотификациями вопрос решить
Alex
Господа, нашел на хугле вот такую функцию — isExtensionOf, но когда я пытаюсь её заимпортить мне пишет что её не существует, в чем дело? import System.FilePath.Posix (isExtensionOf) Module `System.FilePath.Windows' does not export `isExtensionOf'
Alexander
ну могут быть причины , если сишный вызов может крутиться без взаимодействия с RTS и ты не хочешь останавливаться на GC. и иметь независимый размер пула
Alexander
@twesterhout но логично начать с forkOS и потом решать проблемы по мере их поступления
Tom
Tom
Alexander
Alexander
оно в 1.4 появилось
Alex
Ага
Alex
То есть нужно просто указать версию в кабале?
Alexander
думаю все хуже
Alexander
попробуй, но есть шанс, что нужно обновить ghc
Alex
Я его только вчера установил:)
Alexander
т.к. эта либа точно идёт с ghc, но скорее всего пока не будешь как либу его использовать тебе пофиг
Alexander
что говорит ghc-pkg list filepath ?
Alexander
на 8.2+ уже будет подходящая либа
Alex
версия ghc 1.7.1,
Alexander
@al_bl ^
Alexander
1.7.1 ?!
Alex
Я серьезно его вчера установил
Alexander
версия ghc 1.x лет 15 назад была
Alexander
(навскидку)
Alexander
даже 20+
Alexander
это стек наверное?
Alex
Да
Alex
Либо стек либо вообще что-то другое
Alexander
stack exec sh, и там ghc-pkg list filepath
Alexander
у стека команда для ghc-pkg должна быть, но я её не помню
Alex
filepath-1.4.1.2
Alex
Оно
Alex
Но почему-то она все равно не импортится
Alexander
так, должно быть
Alex
build-depends:
base >=4.7 && <5
, zip
, filepath
, directory
Alexander
а в кабале библиотека прописана?
Alexander
хорошо
Alexander
а покажи импорт?
Alexander
в файле и какая именно ошибка
Alex
import System.IO
import System.FilePath
import System.FilePath (isExtensionOf)
import System.Directory
import Codec.Archive.Zip
import Data.Foldable
import Data.String
Alex
Variable not in scope: isExtensionOf :: [Char] -> FilePath -> Bool
|
29 | else if ".zip" isExtensionOf filepath
Alex
А когда я дописал явно что мне нужно
Alex
Выдавало что такой модуль не экспортит эту функцию
Alexander
странно..
Alexander
должно работать
Alexander
а у тебя один target?
Alexander
хотя не, тогда бы другая ошибка была
Alex
Странно это
Alex
Я её конечно сам написал
Alex
Но все равно я удивлен