July 7th, 2009

with Cat The Cat

Ознакомился по роду работы с асоциированными семействами типов.

class TestFunc f where
    type FuncStore f
    evaluateFunc :: f size -> TestMonad (FuncStore f) (SizedInt size)

instance TestFunc CPU1Funcs where
    type FuncStore CPU1Funcs = Funcs1Store
    evaluateFunc (F1 e) = do
        addr <- evalExpr e
        lookupFuncStore addr
Работает.

По ходу дела сделал похожее для других похожих функций, стало компилироваться быстрее.

Оказалось, что 1) очень удобно и 2) заставляет вставлять разного рода типы всюду и везде. Последнее, по моим ощущениям, ведёт к лучшему коду - заставляет повторно использовать одинаковый код.