Как импортировать .hs файл в Haskell

Используя стандарт предварительно протестированный, предварительно созданный материал всегда хорош (например, Повышение как другой предложенный ответ), но это - что-то, что это не слишком твердо для создания самостоятельно. Вот немая небольшая реализация, вытащил из моего проекта:

#include 

struct rwlock {
    pthread_mutex_t lock;
    pthread_cond_t read, write;
    unsigned readers, writers, read_waiters, write_waiters;
};

void reader_lock(struct rwlock *self) {
    pthread_mutex_lock(&self->lock);
    if (self->writers || self->write_waiters) {
        self->read_waiters++;
        do pthread_cond_wait(&self->read, &self->lock);
        while (self->writers || self->write_waiters);
        self->read_waiters--;
    }
    self->readers++;
    pthread_mutex_unlock(&self->lock);
}

void reader_unlock(struct rwlock *self) {
    pthread_mutex_lock(&self->lock);
    self->readers--;
    if (self->write_waiters)
        pthread_cond_signal(&self->write);
    pthread_mutex_unlock(&self->lock);
}

void writer_lock(struct rwlock *self) {
    pthread_mutex_lock(&self->lock);
    if (self->readers || self->writers) {
        self->write_waiters++;
        do pthread_cond_wait(&self->write, &self->lock);
        while (self->readers || self->writers);
        self->write_waiters--;
    }
    self->writers = 1;
    pthread_mutex_unlock(&self->lock);
}

void writer_unlock(struct rwlock *self) {
    pthread_mutex_lock(&self->lock);
    self->writers = 0;
    if (self->write_waiters)
        pthread_cond_signal(&self->write);
    else if (self->read_waiters)
        pthread_cond_broadcast(&self->read);
    pthread_mutex_unlock(&self->lock);
}

void rwlock_init(struct rwlock *self) {
    self->readers = self->writers = self->read_waiters = self->write_waiters = 0;
    pthread_mutex_init(&self->lock, NULL);
    pthread_cond_init(&self->read, NULL);
    pthread_cond_init(&self->write, NULL);
}

pthreads не действительно бывший собственный Windows, но общее представление здесь. Эта реализация немного склоняется к писателям (орда писателей может исчерпать ресурсы читатели неограниченно долго); просто измените writer_unlock, если Вы быть бы баланс быть наоборот.

Да, это - C и не C++. Перевод является осуществлением, оставленным читателю.

Редактирование

Greg Rogers указал, что стандарт POSIX действительно определяет pthread_rwlock_*. Это не помогает, если Вы не имеете pthreads, но это размешало мой ум в запоминание: Pthreads-w32 должен работать! Вместо того, чтобы портировать этот код на не - pthreads для Вашего собственного использования, просто еще используйте Pthreads-w32 в Windows и собственный компонент pthreads везде.

57
задан LambdaScientist 3 January 2017 в 23:42
поделиться

2 ответа

Time.hs :

module Time where
...

script.hs :

import Time
...

Командная строка:

ghc --make script.hs
57
ответ дан 24 November 2019 в 19:43
поделиться

Если модуль time.hs находится в том же каталоге, что и ваш «основной» модуль, вы можете просто ввести:

import Time

Можно использовать иерархический структура, так что вы можете написать import Utils.Time . Насколько мне известно, то, как вы этого хотите, не сработает.

Для получения дополнительной информации о модулях см. Здесь Learn You a Haskell, Making Our Own Modules .

16
ответ дан 24 November 2019 в 19:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: