• Копируется ли состояние при каждой операции над монадой состояния в Haskell?

    Копируется, только надо учитывать ленивость и чистоту Хаскеля.
    Если взять обычный список и класть ему в голову - ничего не надо будет копировать, так как добавление головы не требует копирования хвоста, новый список будет просто ссылаться на хвост. Удаление головы (т.е. взятие хвоста) тоже не требует создавать копий.
    Если же вы будете в качестве состояния использовать какой-либо строгий тип данных, да с unboxed членами, тот да, будет копироваться.
    Надо учитывать так же и другую вещь: накопление thunk'ов. Например, если состояние - это число, и вы миллион раз сделаете modify (+1), по факту там будет лежать отложенное вычисление на миллион прибавлений единиц, что будет кушать память. Потому есть строгая монада state, а также modify', который форсирует применение переданной функции.
    Ответ написан
    Комментировать
  • Как в PowerShell из результатов выполнения команды получить перечень значений в переменную?

    1. В первой строке найти, где заканчивается ID
    2. Остальные строки обрезать, и найти число в конце
    PS> $out = (qwinsta)
    PS> $len = ($out | select -First 1 | ? { $_ -match '.*(ID)' } | % { $matches[0].Length })
    PS> $out | select -skip 1 | % { $_.Substring(0, $len) } | ? { $_ -match '(\d+)$' } | % { $matches[1] }
    0
    2
    65537
    Ответ написан
    5 комментариев
  • Почему cabal test считает все тесты пройденными?

    Выше ответили, я прокомментирую. main должна иметь тип IO t, где t — любой тип, результат будет проигнорирован. Чтобы вернуть exitcode отличный от нуля, надо пользоваться соответствующими функциями: exitWith, exitFailure и прочими. Судя по всему, HUnit этого автоматически не делает, возвращая лишь статистику, которая игнорируется.
    Посему вам надо написать функцию, которая вызовет exitFailure сама, если errors или failures в Counts больше нуля.
    Ответ написан
  • Как написать интерфейс и реализацию шаблонного класса в c++?

    Реализацию тоже в hpp.
    Для каждого параметра T генерируется своя функция, а потому их потенциально бесконечно много, поэтому они должны быть доступны в исходном коде, а не линковаться отдельно.
    Конечно, можно явно инстанцировать для нужных типов, но в вашем случае ни к чему.
    Ответ написан
    Комментировать
  • Как запустить код написанный на Haskell из под Java проекта?

    1) Через C. Haskell экспортит свои функции (foreign export), из Java их зовём (на Java не писал, так что не знаю, как там принято). С тех пор, как я собирал dll под windows прошло много времени, раньше это было несколько напряжно (именно под windows), сейчас возможно и проблемы нет. Почитать можно тут: https://wiki.haskell.org/Calling_Haskell_from_C https://downloads.haskell.org/~ghc/latest/docs/htm...
    2) Через сокеты. Запускаете Haskell-процесс, который слушает подключение. Далее кормите его запросами, а он выдает ответы. В каком виде запросы - неважно, JSON, например.
    Ответ написан
    Комментировать
  • Как посчитать числа кратные двум числам?

    Разложите на множители
    1920 = 2 * 2 * 2 * 2 * 2 * 2 * 2 * 3 * 5
    600 = 2 * 2 * 2 * 3 * 5 * 5

    Общие множители: 2, 2, 2, 3, 5
    Сколько можно составить чисел из них, перемножая? Двойку можно взять от нуля до 3-х раз, т.е. 4 способа. Для 3 и 5 - по два способа (взять или не брать), итого 4 * 2 * 2 = 16 чисел, включая число 1 (все множители берём 0 раз).
    Вот эти числа: 1, 2, 2*2, 2*2*2, 3, 3*2, 3*2*2, 3*2*2*2, 5, 5*2, 5*2*2, 5*2*2*2, 3*5, 3*5*2, 3*5*2*2, 3*5*2*2*2.
    Ответ написан
    1 комментарий
  • Как исправить ошибку?

    Вообще говоря C++ строки так не сортируют, так как они - не-POD. По факту в данном случае qsort меняет местами внутренности std::string, что напрямую делать нельзя (UB).
    Сортировать не-POD типы надо при помощи std::sort.
    Да и вообще, std::sort - шаблонная функция; лучше инлайнится, чем qsort, а посему лучше использовать его в C++ коде.

    #include <string>
    #include <cstdlib>
    #include <iostream>
    #include <algorithm>
    
    int str_compare(std::string const & l, std::string const & r)
    {
    	if (l == r)
    		return 0;
    	return l < r ? -1 : 1;
    }
    int str_compare(void const * l, void const * r) { return str_compare(*static_cast<std::string const *>(l), *static_cast<std::string const *>(r)); }
    
    int main()
    {
    	std::string strs[3] = { "foo", "bar", "baz" };
    	std::qsort(strs, 3, sizeof(std::string), str_compare); // В общем, работает, но UB
    	// std::sort(&strs[0], &strs[0] + 3); // вот так - лучше
    	for (auto & s : strs)
    		std::cout << s << std::endl;
        return 0;
    }
    Ответ написан
  • Чем отличается синхронный сервер от асинхронного сервера в boost?

    Сразу оговорюсь, могу ошибаться, я boost asio не использовал

    С синхронным всё верно. При этом клиенты обрабатываются по очереди.
    С асинхронным иначе.

    1. В конструкторе tcp_server зовётся start_accept, который зовёт async_accept и возвращается управление обратно.
    2. Затем зовется io_service.run(), судя по всему, где-то внутри он-таки принимает подключение и вызывает handle_accept, который был забинжен при start_accept и пункта 1.
    3. handle_accept зовёт start, который зовёт async_write, т.е. не дожидается отправки данных, а опять же сразу возвращает управление. По окончании отправки вызовется handle_write
    4. затем снова start_accept -> async_accept и возврат

    Т.е. в синхронном случае второй клиент не подключится, пока первому полностью не ответят
    В асинхронном случае вызывается async_write, и до окончания ответа первому клиенту, в принципе может уже подключиться второй.

    Вообще асинхронный способ для того и нужен, чтобы, приняв соединение клиента, сразу начинать принимать следующего, а с первым клиентом работать уже отдельно.
    Ответ написан
    1 комментарий
  • Как отсортировать map по значению?

    Вопрос не имеет смысла, так как map хранит сортированно по ключу (возможен кастомный компаратор) и не позволяет менять этот порядок. Так что по значению - никак. Доставайте оттуда пары, да сортируйте. Какая задача вообще решается?
    Ответ написан
    1 комментарий
  • Как вызывать свой плагин, написанный на Sublime Text 2?

    В папке Packages положите свой *.py файл (в подпапку с именем вашего плагина, хотя можно и просто в User-папку для теста) с ExampleCommand из приведённой вами ссылки.
    Затем в консоли (ctrl+`):
    import sublime
    sublime.active_window().active_view().run_command('example')


    Если это работает, значит команда подхватилась, надо теперь прописать её куда-либо:
    1. в команды по ctrl-p - файл с расширением .sublime-commands, также в папке плагина, но сработает и в User
    2. в меню - .sublime-menu
    3. в контекстное меню - Context.sublime-menu
    4. на сочетание клавиш - .sublime-keymap

    Примеры, думаю, найдёте.
    Ответ написан
    Комментировать
  • Сидячий образ жизни кодера на самом деле ухудшает здоровье?

    Целью бороться не задавался, просто случайно нашёл спорт (в моём случае - велотриал), заниматься которым мне в кайф, потому и не лень.
    Ответ написан
  • Как динамически создать n-ое количество потоков в с++ std::thread?

    #include "stdafx.h"
    #include <thread>
    #include <vector>
    #include <iostream>
    
    void foo(std::size_t i)
    {
    	// nothing to do
    }
    
    int main()
    {
    	std::vector<std::thread> ths;
    	std::size_t n;
    	std::cin >> n;
    	for (std::size_t i = 0; i < n; ++i)
    		ths.push_back(std::thread(&foo, i));
    	for (auto & th : ths)
    		th.join();
    	return 0;
    }
    Ответ написан
    6 комментариев
  • Как составить регулярку по следующим параметрам?

    ^data:(?<Mime>.*?);base64.*$

    https://regex101.com/r/jA0lR8/1
    Ответ написан
    Комментировать
  • Какой ФП язык выучить?

    Если в академических, то, как ответили выше, учите Haskell, а лучше [сразу или потом] Agda2 с зависимыми типами, узнаете много нового.
    Ответ написан
    Комментировать
  • Как убрать эту размытость?

    Попробуйте изменить "размеры текста и других элементов", если Windows 10, то "параметры - система - экран". Если Windows 8, то не помню, но поищите по закавыченной фразе.
    Ответ написан
    Комментировать
  • Как получить указатель на метод объекта?

    Можно
    Если напрямую, то надо использовать тип "указатель на функцию член" вида Ret (Class::*)(Args...) [const]. Сам указатель получать &Class::Fun, а вызывать операторами .* или ->*
    Или использовать std::function (boost::function), std::bind (boost::bind) или std::mem_fun, std::mem_fn для более унифицированного подхода:

    struct some
    {
    	some() : value(0) {}
    
    	int inc() { return ++value; }
    	int dec() { return --value; }
    	int get() const { return value; }
    
    	int value;
    };
    
    int main()
    {
    	some s;
    
    	int (some::*inc_f)() = &some::inc; // inc_f - указатель на функцию
    	std::cout << "(s.*inc_f)() = " << (s.*inc_f)() << std::endl; // оператор .* - оператор вызова по указателю на функцию
    	int (some::*val_ptr) = &some::value; // val_ptr - указатель на член
    	s.*val_ptr = 10;
    	std::cout << "s.*val_ptr = " << s.*val_ptr << std::endl;
    
    	int (some::*const_f)() const = &some::get; // const-функция
    	std::cout << "s.*const_f() = " << (s.*const_f)() << std::endl;
    
    	using namespace std::placeholders;
    	std::function<int (some&)> mem_f;
    	
    	mem_f = std::bind(&some::inc, _1); // биндим на функцию-член, _1 - placeholder для объекта
    	std::cout << "mem_f(s) = " << mem_f(s) << std::endl; // s.inc();
    	mem_f = std::mem_fn(&some::dec); // другой способ через mem_fn
    	std::cout << "mem_f(s) = " << mem_f(s) << std::endl; // s.dec();
    
    	std::function<int()> mem_f_ = std::bind(&some::inc, &s); // биндим на функцию член и сразу указываем объект, получаем функцию без аргументов
    	std::cout << "mem_f_() = " << mem_f_() << std::endl; /// s.inc();
    
    	std::function<int(some const &)> const_fn = std::mem_fn(&some::get); // some const &
    	std::cout << "const_fn(s) = " << const_fn(s) << std::endl;
    
        return 0;
    }
    Ответ написан
    Комментировать
  • Как отбросить выбивающиеся элементы из потока схожих (фильтрация входных данных)?

    Могу предложить тупое решение.
    Накапливайте кол-во встречающихся чисел, например, в std::map<int, std::size_t>
    std::map<int, std::size_t> m;
    for (int v : vals) { ++m[v]; }
    std::vector<std::pair<int, std::size_t> > v(m.begin(), m.end());
    std::sort(v.begin(), v.end(), [] (std::pair<int, std::size_t> const & l, std::pair<int, std::size_t> const & r) { return l.second > r.second; });
    // в v пары "число - кол-во таких чисел", отсортированы по убыванию
    // можно откинуть нижнюю часть (те, которые встречаются реже, чем какой-то процент, например, 10%)
    v.erase(
      std::find_if(v.begin(), v.end(), [] (std::pair<int, std::size_t> const & x) { return x.second < (v.size() / 10); }),
      v.end());
    // а сверху взять часто встречающиеся
    int row_value = v.front().first;
    Ответ написан
    Комментировать
  • Валидно ли передавать ссылку по ссылке в C++?

    1. UB нет
    2. Может
    3. inline не влияет
    4. Насколько я знаю, нет

    Запрет существования ссылок на ссылки - это отсутствие типа (T &) &. Сравни с указателем: тип (T *) * вполне допустим.

    Проблема со ссылками может быть, если объект, на который ссылаются, помирает раньше, чем ссылка, например
    struct foo { foo(int const & x) : x_(x) {}; int const & x_; };
    
    int bar() { return 42; }
    void baz() { foo f(bar()); ... } // здесь в foo передается ссылка на временный объект, который умирает в конце выражения, однако ссылка сохраняется в объекте f.


    Или проще
    struct foo { foo(int & x) : x_(x) {}; int & x_; };
    
    void foo()
    {
      std::shared_ptr<foo> f;
      {
        int x;
        f.reset(new foo(x));
      } // тут x помирает, ссылка на него невалидна
      f->x_ = 10; // UB
    }
    Ответ написан
    4 комментария
  • Возможно ли экспортировать шаблоны из dll?

    Можно, если инстанцировать шаблоны явно для заранее определённых типов, например:

    template <typename T> struct Vector { ... };
    template <typename T> void foo(Vector<T> &); // definition in cpp
    
    template struct Vector<Point2d>;
    template struct Vector<Point3d>;
    
    template void foo<Point2d>(Vector<Point2d> &);
    template void foo<Point3d>(Vector<Point3d> &);


    Структуры Vector<Point2d> и Vector<Point3d> будут экпортированы.
    Ответ написан
    Комментировать
  • Как запустить PowerShell команды из Perl скрипта?

    Просто как программу позвать
    powershell -Command { ... }
    powershell -File ...
    Ответ написан
    Комментировать