поиск изучения осуществления: реализуйте эти монады

Файлы манифеста Windows являются ресурсами Win32. Другими словами, они встраиваются к концу EXE или DLL. Можно использовать LoadLibraryEx, FindResource, LoadResource и LockResource для загрузки встроенного ресурса.

Вот простой пример, который извлекает его собственную декларацию...

BOOL CALLBACK EnumResourceNameCallback(HMODULE hModule, LPCTSTR lpType,
    LPWSTR lpName, LONG_PTR lParam)
{
    HRSRC hResInfo = FindResource(hModule, lpName, lpType);
    DWORD cbResource = SizeofResource(hModule, hResInfo);

    HGLOBAL hResData = LoadResource(hModule, hResInfo);
    const BYTE *pResource = (const BYTE *)LockResource(hResData);

    TCHAR filename[MAX_PATH];
    if (IS_INTRESOURCE(lpName))
        _stprintf_s(filename, _T("#%d.manifest"), lpName);
    else
        _stprintf_s(filename, _T("%s.manifest"), lpName);

    FILE *f = _tfopen(filename, _T("wb"));
    fwrite(pResource, cbResource, 1, f);
    fclose(f);

    UnlockResource(hResData);
    FreeResource(hResData);

    return TRUE;   // Keep going
}

int _tmain(int argc, _TCHAR* argv[])
{
    const TCHAR *pszFileName = argv[0];

    HMODULE hModule = LoadLibraryEx(pszFileName, NULL, LOAD_LIBRARY_AS_DATAFILE);
    EnumResourceNames(hModule, RT_MANIFEST, EnumResourceNameCallback, NULL);
    FreeLibrary(hModule);
    return 0;
}

, С другой стороны, можно использовать MT.EXE из Windows SDK:

>mt -inputresource:dll_with_manifest.dll;#1 -out:extracted.manifest
7
задан Jim Ferrans 3 October 2009 в 23:04
поделиться

3 ответа

Я думаю, что каталог в Все о монадах - хорошее начало (монада продолжения действительно полезна для катаморфизмов, см., Например, здесь ); дополнительно парсеры и, возможно, транзакционные эффекты . Async - еще один хороший вариант, который можно попробовать реализовать самостоятельно (логически-однопоточный код, который переключается между разными фактическими потоками, чтобы быть неблокирующим). И монада, лежащая в основе Reactive Framework , кажется хорошей сложной задачей.

5
ответ дан 7 December 2019 в 05:25
поделиться

Список структур данных / вычислений, которые следуют какому-то монадическому закону, чрезвычайно богат.

Он исходит из списков по необязательным данным ( 'опция в F #) , продолжения и многопоточность вплоть до очень сложных вещей, таких как парсеры.

Просто начните реализовывать некоторые из них. Основные упражнения:

// Identity monad

let something = ident {
    let! value = id 42
    return value
}

let somethingelse = ident {
    let! value = something
    let! otherValues = id 40
    return value + othervalue
}


// Implement maybe for 'a option
let sum = maybe {
    let! a = maybeInputNumber("a")
    let! b = maybeInputNumber("b")
    let! c = maybeInputNumber("c")
    return a + b + c
}

match sum with
| None -> ...
| Some(n) -> ...

Вы также можете улучшить свое понимание, играя немного с вспомогательными функциями и явным монадическим синтаксисом.

// Given m >>= f for m.Bind(f)

let (>-) f monad = monad >>= (fun k -> return(f x))

// What's this?
let res = ((+) 1) >- [1..10]

Если вам нужны сложные примеры, взгляните на комбинаторы монадического синтаксического анализатора . Это позволит вам реализовать сложные рекурсивные анализаторы спуска на простом F # (взгляните на FParsec -Project)

let parseVector = parser {
    do! ignore $ char '('
    let! [x;y;z] = sepBy parseNumber "," 
    do! ignore $ char ')'
    return new Vector(x, y, z)
}

Простая реализация для этого основана на следующих типах:

type 't Computation = 
    | Error of ...
    | Result of 't

type Input     = char list
type 'a Parser = Input -> (('a * Input) Computation)

Попробуйте реализовать bind и return ; -)

И в качестве общего совета: если вы действительно хотите понять монады в их естественной среде, вам придется использовать Haskell ;-) В F # есть просто вычислительные выражения, просто расплывчатый аналог, но Haskell представляет общий интерфейс для любых монадических вычислений. Идеально, чтобы их попробовать!

2
ответ дан 7 December 2019 в 05:25
поделиться

Хотя я полагаю, что нет ничего сложного в том, что Haskell является естественным языком для изучения монад, я считаю, что очень полезным упражнением является перенос монадических вычислений на язык, который не прямо из коробки, имейте суперплавную поддержку в стиле Haskell. Это вполне возможно на любом языке, и на любом языке достаточно высокого уровня, вероятно, можно будет проявить творческий подход и действительно заставить их выглядеть красиво - многому научившись в процессе! Я видел классный монадический синтаксис для Python (я думаю, на Valued Lessons ), например.

Также есть библиотека Clojure clojure.contrib.monads, которая предоставляет хорошие возможности для использования монад в Лиспе. Попытка воссоздать его функционально может быть весьма поучительной. Также,

1
ответ дан 7 December 2019 в 05:25
поделиться
Другие вопросы по тегам:

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