Załóżmy, że pracuję z kodem maszyny stosu, która może wykonywać proste operacje (push constant, add, mul, dup, swap, pop, convert types) na int i double .Sprawdzanie poprawności programu przy użyciu typów fantomowych w Haskell
Teraz program, który piszę, przyjmuje opis w jakimś innym języku i tłumaczy go na kod dla tego komputera stosu. Muszę również obliczyć maksymalny rozmiar stosu.
Podejrzewam, że to możliwe, aby używać sprawdzania typu Haskell, aby wyeliminować kilka błędów, np:
- popping z pustego stosu
- namnażania deble za pomocą int mnożenie
Myślałam, że może zadeklarować na przykład:
dup :: Stack (a :%: b) -> Stack (a :%: b :%: b)
int2double :: Stack (a :%: SInt) -> Stack (a :%: SDouble)
i tak dalej. Ale nie wiem, jak wygenerować kod i obliczyć rozmiar stosu.
Czy można to zrobić w ten sposób? Czy byłoby to proste/wygodne/warto?
co masz na myśli przez "Ale wtedy nie wiem, jak wygenerować kod i obliczyć rozmiar stosu." –
Myślałem, że te typy sprawią, że przemijające wyniki staną się trudniejsze - na przykład będę mógł napisać 'do {pushInt 2; dup; addInts} '? – mik01aj
Czy widzisz jakieś problemy, jeśli używasz odpowiedzi sclv? –